UVa1625 顏色長度(DP)

2021-08-28 18:01:01 字數 1270 閱讀 3368

思路:紫書上寫的很詳細了:不是等到乙個顏色全部移完之後再相加,而是每次都計算已經開始但還沒結束的顏色的個數並將長度累加。

所以,用res[i][j]表示第乙個串還剩i個,第二個串還剩j個,已經開始但還沒結束的字元個數。

dp[i][j]表示第乙個還剩i個,第二個串還剩j個,還需要的最小指標函式。(和書上不同)

轉移方程為:dp[i][j]=min(dp[i+1][j],dp[i][j+1])+res[i][j];

**:

#include #include #include #include using namespace std;

const int inf=0x3f3f3f3f;

const int maxn=5000+20;

char s1[maxn],s2[maxn];

int dp[maxn][maxn];//第一串還剩i個,第二個串還剩j個,還需多少費用。

int res[maxn][maxn];//第乙個串i個,第二個串j個,有多少以開始還未結束的字元

int start[27][2];

int end1[27][2];

/* 轉移方程:dp[i][j]=min(dp[i+1][j],dp[i][j+1])+res[i][j];

*/int main()

}memset(start,inf,sizeof(start));

memset(end1,-1,sizeof(end1));

for(int i=0;ii-1&&start[k][1]>j-1)continue;//現在還沒開始

if(end1[k][0]=0;i--)

dp[i][len2]=dp[i+1][len2]+res[i][len2];//只從第乙個串選

for(int i=len2-1;i>=0;i--)

dp[len1][i]=dp[len1][i+1]+res[len1][i];//只從第二個串選

for(int i=len1-1;i>=0;i--)

for(int j=len2-1;j>=0;j--)

dp[i][j]=min(dp[i+1][j],dp[i][j+1])+res[i][j];

printf("%d\n",dp[0][0]);

}return 0;

}

uva1625 顏色的長度

兩個佇列的類似最長公共子串行問題常定義狀態為,分別移動了多少個元素。複雜代價預處理,然後狀態轉換時直接呼叫。滾動陣列可以利用多層來表示相鄰層次關係,利用t 1 來進行0和1的狀態轉換。include include include using namespace std const int maxn...

uva1625 顏色的長度

注意每次迴圈中對d陣列的初始化,不需要呼叫 memeset d,1,sizeof d 因為d陣列申請了maxl 5000 10的空間大小,這個語句在實際執行會很耗時間。而且也並不是d陣列所有的空間都需要初始化。只初始化會用到的值足矣。include include include include u...

Uva 1625,顏色的長度

類似於lcs的動態規劃,指標函式的分解。題目大意 兩個顏色序列,將他們合併,合併的時候,每次都從開頭拿顏色,對於每乙個顏色 c來說,都有他的跨度 l c 就是最後的位置與最前的位置的差值,就怎樣的排列是的所有 l c 總和最小。分析 從兩個串中隨機拿字元,解答樹是特別大的。d i,j p拿前 i 個...