兩個佇列的類似最長公共子串行問題常定義狀態為,分別移動了多少個元素。
複雜代價預處理,然後狀態轉換時直接呼叫。
滾動陣列可以利用多層來表示相鄰層次關係,利用t^=1 來進行0和1的狀態轉換。
#include
#include
#include
using namespace std;
const int maxn = 5000 + 5;
const int inf = 1000000000;
char p[maxn], q[maxn]; // starts from position 1
int sp[26], s
q[26], ep[26], eq[26]; // sp[i] start positions of character i in p
int d[2][maxn], c[2][maxn]; // c[i][j]: how many "incomplete" colors in the mixed sequence
int main()
for(int i = 1; i <= n; i++)
for(int i = 1; i <= m; i++)
// dp
int t = 0;
memset(c, 0, sizeof(c));
memset(d, 0, sizeof(d));
for(int i = 0; i <= n; i++) else
if(j)
}t ^= 1;//exchange the state
}printf("%d\n", d[t^1][m]);
} return
0;}
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 個...
UVa1625 顏色長度(DP)
思路 紫書上寫的很詳細了 不是等到乙個顏色全部移完之後再相加,而是每次都計算已經開始但還沒結束的顏色的個數並將長度累加。所以,用res i j 表示第乙個串還剩i個,第二個串還剩j個,已經開始但還沒結束的字元個數。dp i j 表示第乙個還剩i個,第二個串還剩j個,還需要的最小指標函式。和書上不同 ...