紫書上的例題,在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...