1,dp[i][j]代表的时s1到si序列和t1到ti序列对应的LCS的长度。
由此,s1到s(i+1)和t1到t(j+1)对应的公共子列可能是
①当s(i+1)==t(j+1),在s1到si和t1到ti的公共子列末尾加上s(i+1)
②s1到si和t1到t(i+1)的公共子列
③s1到s(i+1)和t1到ti的公共子列
2,不过你说这也挺神奇的,就这么一点,也没其他东西就能算出来。
3,我tm真想把这上面的复制到这上面去。
#include<iostream> using namespace std; const int maxn=1005; int n,m; char s[maxn],t[maxn]; int dp[maxn][maxn]; int main(){ cin>>n>>m; for(int i=0;i<n;i++){cin>>s[i];cin>>t[i]; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i]==t[j]){dp[i+1][j+1]=dp[i][j]+1; } else{dp[i+1][j+1]=max(dp[i][j+1],dp[j+1][i]); } } } cout<<dp[n][m]<<endl; }
4,我们开始费大,和费小,
费大的话这种字母这东西我就当数字了。关键是,状态的设置,简直如同羚羊挂角,无迹可寻。呵呵,这不是描述刀的嘛??
我觉得这个可以当成一个一维的找相同的问题。
一维儿子找相同问题。
那状态设置呢?
开门见山,正对题目。那递推式子怎么来。
递推式子的话先想特殊情况,比如相等了什么啦
关于dp的费小,实在是。。。总结出dp思想也行。毕竟dp只要你设计出好的状态,出来递推式子,基本上就没有问题了。