1492千鳥試合

タイトル説明

自然数、UP [1 ... N]、2行ある DOWN [1 ... M]は、 UP [I] = DOWN [J場合 ] = K、 次いで、アップリンクI番目の位置の数ができ、ダウンリンクJ番目とKマッチとして知られている行の偶数、だけ位置の数と接続ラインまで。また、各Kとは一致交差LとK≠Lと一致しなければなりません!今試合の最大数を必要とします。
たとえば、次のマッチの最大数は2行より少ない数8
ここに画像を挿入説明

エントリー

文書CROSS。読み出しデータは、最初の行から2つの正の整数N及びMであります UPの自然数N、MのDOWN第三列の自然数の2行目。ここで、0 <N、M <= 200、UP、多くて32,767以下の数DOWN。

輸出

CROSS.OUTに出力を一致の最大数。

コード

#include<cstdio>
#include<algorithm>
using namespace std;
int a[205]={0},b[205]={0},f[205][205]={0},n,m,la,lb;

void get(int i,int j)
{
    int x=a[i],y=b[j];
    la=i-1;
    lb=j-1;
    while(a[la]!=y && la>0)la--;
    while(b[lb]!=x && lb>0)lb--;
}

int main()
{
    freopen("cross.in","r",stdin);
    freopen("cross.out","w",stdout);
    int i,j,k,t;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++) scanf("%d",&a[i]);
    for(i=1;i<=m;i++) scanf("%d",&b[i]);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            f[i][j]=max(f[i-1][j],f[i][j-1]);
            get(i,j);
            if(la!=0 && lb!=0 && a[la]!=b[lb]) if(f[la-1][lb-1]+2>f[i][j]) f[i][j]=f[la-1][lb-1]+2;
        }   
    printf("%d",f[n][m]);
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_40155097/article/details/95317131