UVa 1625 動態規劃

2021-08-21 07:06:46 字數 715 閱讀 2845

需要注意c[i][j]的遞推演算法和sp,sq,ep,eq的賦初值。由於dp[i][j]表示第乙個字串取i個,第二個字串取j個,所以不論dp[i][j]從dp[i-1][j]+c[i-1][j]來的還是從dp[i][j-1]+c[i][j-1]來的,都可以在保證i != 0的情況下用c[i][j] = c[i-1][j] +/- 1 或0來算。

#include#include#include#includeusing namespace std;

const int maxn = 5000 + 5;

const int inf = 10000000;

char p[maxn], q[maxn];

int sp[26], sq[26], ep[26], eq[26];

int d[maxn][maxn], c[maxn][maxn];

int main()

//預處理,計算出序列1中每個字元的開始位置和結束位置

for (int i = 1; i <= n; i++)

//預處理序列2

for (int i = 1; i <= m; i++)

for (int i = 0; i <= n; i++)

else if (j)

}}

cout << d[n][m] << endl;

}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...

UVa1625 顏色長度(DP)

思路 紫書上寫的很詳細了 不是等到乙個顏色全部移完之後再相加,而是每次都計算已經開始但還沒結束的顏色的個數並將長度累加。所以,用res i j 表示第乙個串還剩i個,第二個串還剩j個,已經開始但還沒結束的字元個數。dp i j 表示第乙個還剩i個,第二個串還剩j個,還需要的最小指標函式。和書上不同 ...