动态规划 —— 线性 DP —— 序列问题
生活随笔
收集整理的這篇文章主要介紹了
动态规划 —— 线性 DP —— 序列问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【基本概念】
【LIS問題】
LIS 問題(Longest Increasing Subsequence),最長上升子序列,其一般為求最長下降子序列或是最長上升子序列。
用 DP[i] 表示 A[i] 為結尾的最長上升子序列的長度,則有狀態轉移方程:
模板:
for(int i=2;i<=n+1;i++) {int num=0;for(int j=i-1;j>=1;j--)if(a[i]>a[j])num=max(num,dp[j]);dp[i]=num+1; }【LCS 問題】
LCS 問題(Longest Common Subsequence),求序列的最長公共子序列。
F[i][j]?表示前綴子串 A[1~i] 與 B[1~j] 的最長公共子序列的長度,則有狀態轉移方程:?
即:
模板:
char s[MAX],t[MAX]; scanf("%s%s",s,t); int x=strlen(s),y=strlen(t); for(i=0;i<x;i++) { for(j=0;j<y;j++) {if(s[i]==t[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i][j-1],dp[i-1][j]); } printf("%d\n",dp[i][j]); }【LCIS 問題】
LCIS 問題(Longest Common Increasing Subsequence),求序列的最長公共上升子序列。
用 F[i][j] 表示 A[1~j] 與 B[1~j] 可以構成的以 B[j] 為結尾的 LCIS 的長度,易得狀態轉移方程:
因此對于決策集合中的元素只增多不減少的情景,就可以維護一個變量來記錄決策集合的當前消息,只需要兩重循環即可求解。
模板:
for (int i=1;i<=n;++i) {int val=0;//val是決策集合S(i,j)中f[i-1][k]的最大值 for(int j=1;j<=m;++j){//原來的k循環+判斷+狀態轉移 if (a[i]==b[j]) f[i][j]=val+1;else f[i][j]=f[i-1][j];if (b[j]<a[i]) val=max(val,f[i-1][j]);//j即將增大為j+1,檢查j能否進入新的決策集合 } }總結
以上是生活随笔為你收集整理的动态规划 —— 线性 DP —— 序列问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01串(51Nod-1391)
- 下一篇: 矩形并的面积(51Nod-2488)