hdu 1159 common subsequence (最長公共子串行 lcs)
題意不多說,就是最長公共子串行的模板題
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3fffffff
#define ll long long
const int n=1e3+1;
char a[n],b[n];
int dp[n][n];
int main()
printf("%d\n",dp[la][lb]);
}}
hdu 1503advanced fruits (最長公共子串行+遞迴輸出)
題意:給你兩串字串,將兩字串結合起來形成一串,公共子串行只出現一次,將這串串行輸出。
兩種方法,lcs方面沒什麼不一樣的關鍵是輸出字串,可以遞迴也可以非遞迴。這裡要用二維陣列標記一下,詳細看**
//非遞迴
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3fffffff
#define ll long long
const int n=110;
char a[n],b[n],s[n*2];
int dp[n][n];
int main()
else if(dp[i][j-1]>=dp[i-1][j]) s[k++]=b[j--];
else s[k++]=a[i--];
}//沒有公共子串行時直接將兩字串存到s陣列裡面
while(i!=0) s[k++]=a[i--];
while(j!=0) s[k++]=b[j--];
for(i=k-1;i>=0;i--)
printf("%c",s[i]);
printf("\n");
}}
//遞迴
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3fffffff
#define ll long long
const int n=101;
int la,lb,dp[n][n],vis[n][n];//vis陣列標記用於輸出
char a[n],b[n];
void lcs()
else if(dp[i][j-1]>=dp[i-1][j])
else if(dp[i][j-1]}
}}void out(int i,int j)
//有公共子串行時遞迴輸出
else if(vis[i][j]==1)
else if(vis[i][j]==2)
else if(vis[i][j]==3)
}int main()
}
LCS 最長公共子串行
問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...
LCS最長公共子串行
求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...
LCS最長公共子串行
lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...