做題記錄uva1625

2021-10-01 11:55:28 字數 1269 閱讀 5201

紫書上的例題,在dp中運用了一些技巧,領悟了些許。

記錄兩個子串中各字母的開始和結束位置,每次dp時只要有已開始但未結束的字母就加1.

要搞清楚dp時i,j的含義,是已選還是未選,這樣才能保證dp是條件寫對。

要學會預處理。

題目鏈結

**

#include

using

namespace std;

int dp[

5005][

5005];

int bs1[27]

,bs2[27]

,es1[27]

,es2[27]

;int

main()

// memset(dp,0,sizeof(dp));

scanf

("%s"

,s1+1)

;scanf

("%s"

,s2+1)

;int len1=

strlen

(s1+1)

;int len2=

strlen

(s2+1)

;for

(int i=

1;i<=len1;i++

) s1[i]-=

'a';

for(

int i=

1;i<=len2;i++

) s2[i]-=

'a';

for(

int i=

1;i<=len1;i++

)for

(int i=

1;i<=len2;i++

)for

(int i=

0;i<=len1;i++)if

(!i)

dp[i]

[j]=dp[i]

[j-1

]+tmp;

}elseif(

!j) dp[i]

[j]=dp[i-1]

[j]+tmp;

}else

dp[i]

[j]=

min(dp[i-1]

[j]+tmp1,dp[i]

[j-1

]+tmp2);}

}}printf

("%d\n"

,dp[len1]

[len2]);

}return0;

}

看了**倉庫裡劉汝佳老師的**,沒有開[5000][5000]的陣列,再看看吧。

UVa 1625 動態規劃

需要注意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來算...

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