類似於lcs的動態規劃,指標函式的分解。
題目大意:兩個顏色序列,將他們合併,合併的時候,每次都從開頭拿顏色,對於每乙個顏色
c來說,都有他的跨度
l(c)
,就是最後的位置與最前的位置的差值,就怎樣的排列是的所有
l(c)
總和最小。
分析:從兩個串中隨機拿字元,解答樹是特別大的。
d(i,j) p拿前 i 個字元, q拿前 j 個字元 所要的代價。
n,m<=5000,二維陣列改成滾動陣列。
這個時候,不是等到乙個顏色全部移動玩了之後再算跨度。而是,只要多少種顏色已經開始但尚未結束,l(c) + 1;
重點再與求代價c。首先計算全部移動q,只要是該字元開頭,代價就加一,但是如果剛好是最後乙個就恢復。然後再推陣列p時,就可以直接利用已經計算好的c代價陣列,只需要根據他更新由於i的加入使得增加的代價。
#include usingnamespace
std;
#define maxn 5005
#define inf 0x3f3f3f3f
char
p[maxn],q[maxn];
int sp[26],ep[26],sq[26],eq[26
];int d[2][maxn],c[2
][maxn];
intmain()
for(int i=1; i<=n; i++)
for(int i=1; i<=m; i++)
memset(c,
0,sizeof
(c));
memset(d,
0,sizeof
(d));
int t = 1
;
//dp
for(int i = 0; i <= n; i++)
else
if(j)
}t ^= 1
; }
printf(
"%d\n
", d[t^1
][m]);
}return0;
}
兩個顏色序列,將他們合併,合併的時候,每次都從開頭拿顏色,對於每乙個顏色
c來說,都有他的跨度
l(c)
,就是最後的位置與最前的位置的差值,就怎樣的排列是的所有
l(c)
總和最小。
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個,還需要的最小指標函式。和書上不同 ...