Uva 1625,顏色的長度

2022-04-01 07:47:54 字數 1203 閱讀 4002

類似於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 using

namespace

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