HDOJ_1159_ Common Subsequence

这道题如果用动态规划的思想,就很简单;我开始用的是暴力法,一直wa;后来改用动态规划,开始我的内存超了,然后我有吧把Max从10010改成505就过了。

思路:

从后往前进行推导:

当a[i]==b[j]时:dp[i][j]=dp[i-1][j-1]+1;

当a[i]!=b[j]时:dp[i][j]=max(dp[i][j-1],dp[i-1][j]);

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring> 
#include <algorithm>
#define Max 505
using namespace std;

char a[Max],b[Max];
int dp[Max][Max]; 

int main(void)
{
    int lena,lenb;
    freopen("in.txt","r",stdin);
    while(scanf("%s %s",a+1,b+1)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        lena=strlen(a+1);
        lenb=strlen(b+1);
        
        for(int i=1;i<=lena;i++)
            for(int j=1;j<=lenb;j++)
                if(a[i]==b[j])
                    dp[i][j]=dp[i-1][j-1]+1;
                else
                    dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
                    
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        printf("%d\n",dp[lena][lenb]);
    }
    
    fclose(stdin);
    return 0;
}

 

posted @ 2018-12-17 08:26  pha创噬  阅读(85)  评论(0编辑  收藏  举报