zoukankan      html  css  js  c++  java
  • C++练习 | 最长公共字符串(DP)

    HDU 1159.Common Subsequence

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<cstring>
    #include<string.h>
    using namespace std;
    int dp[10007][10007];//a的前i个字母与b的前j个字母的有序交集长度
    int main()
    {
        // freopen("01.in","r",stdin);
        string a,b;
        while(cin>>a>>b)
        {
            int m=a.length();
            int n=b.length();
            dp[0][0]=0;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(a[i]==b[j])
                    {
                        if(j!=0&&i!=0)
                            dp[i][j]=dp[i-1][j-1]+1;
                        else
                            dp[i][j]=1;
                    }
                    else
                    {
                        if(j!=0&&i!=0)
                        {
                            dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                        }
                        else if(i==0)
                        {
                            dp[i][j]=max(0,dp[i][j-1]);
                        }    
                        else
                        {
                            dp[i][j]=max(0,dp[i-1][j]);
                        }    
                    }
                }
            }
            cout<<dp[m-1][n-1]<<endl;
        }
        return 0;
    }

    零点处理有些过于麻烦了,可以通过更改i,j初始值简化,但是懒得改了

    不算太明白以后再看看

  • 相关阅读:
    ATM代码及遇到的问题总结
    暑假日报-52
    暑假日报-51
    暑假日报-50
    暑假日报-49
    暑假日报-48
    线段树优化建图(炸弹 + 选课)
    联考day2 C. 舟游
    联赛模拟测试5题解
    第19周作业
  • 原文地址:https://www.cnblogs.com/tsj816523/p/11226583.html
Copyright © 2011-2022 走看看