需要注意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個,還需要的最小指標函式。和書上不同 ...