ブルーブリッジカップ_最長共通部分列_dp

    

 

//
#include<bits/stdc++.h>
using namespace std;

const int N=1e3+4;
int a[N],b[N],dp[N][N];
int n,m;

void solve()
{
    memset( dp,0,sizeof( dp ) );
    for( int i=1;i<=n;i++ )
        for( int j=1;j<=m;j++ )
        {
            if( a[i]==b[j] )    dp[i][j]=max( dp[i][j],dp[i-1][j-1]+1 );
            else                dp[i][j]=max( dp[i-1][j],dp[i][j-1] );
        }
}

int main()
{
    int i;
    while( cin>>n>>m )      // 01 dp[0][0] 方便处理起始条件
    {                       // 02 dp[n][m] 可以直接输出
        for( i=1;i<=n;i++ ) cin>>a[i];
        for( i=1;i<=m;i++ ) cin>>b[i];
        solve();
        cout<<dp[n][m]<<endl;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_63173957/article/details/123906468