LCS问题

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只要你设计出好的状态,出来递推式子,基本上就没有问题了。

posted @ 2020-01-03 13:23  北月真好  阅读(376)  评论(0编辑  收藏  举报