PAT (Advanced Level) Practice - 1045 Favorite Color Stripe(30 分)

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:找规律:row,col 都从 1 开始,外围为 0;当前位置填入的值val = max(相邻左,相邻上),如果 like[i] == give[j],val = ++ma,否认 val = ma。

    2 2 4 1 5 5 6 3 1 1 5 6
  0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 1 2 2 2 2 2 2 2 2 2 2 2
3 0 1 2 2 2 2 2 2 3 3 3 3 3
1 0 1 2 2 3 3 3 3 3 4 5 5 5
5 0 1 2 2 3 4 5 5 5 5 5 6 6
6 0 1 2 2 3 4 5 6 6 6 6 6 7

 

 

 

 

 

 

 

 

注意:WA 代码 与 AC 代码区别是:WA代码先手动初始化(1,1)开始,再自动填充;而AC代码是利用外围的(0,0)直接自动填充;如图所示有一种情况WA代码(码如其名):

PAT (Advanced Level) Practice - 1045 Favorite Color Stripe(30 分)_第1张图片

 

PAT (Advanced Level) Practice - 1045 Favorite Color Stripe(30 分)_第2张图片

 

AC 代码

#include
#include

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int M=210, L=1e4+10;

int like[M], give[L], rsrr[M][L];

int main()
{
    int n,m,l,ma;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d",&like[i]);
    scanf("%d",&l);
    for(int i=1;i<=l;i++) scanf("%d",&give[i]);

    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=l;j++)
        {
            ma=max(rsrr[i-1][j],rsrr[i][j-1]);
            if(like[i]==give[j]) rsrr[i][j]=++ma;
            else rsrr[i][j]=ma;
        }
    }

    printf("%d\n",ma);

    return 0;
}

 

WA 代码

#include
#include

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int M=210, L=1e4+10;

int like[M], give[L], rsrr[M][L];

int main()
{
    int n,m,l,ma;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d",&like[i]);
    scanf("%d",&l);
    for(int i=1;i<=l;i++) scanf("%d",&give[i]);

    int th=0;
    for(int i=1;i<=l;i++)
        if(like[1]==give[i]) rsrr[1][i]=++th;
        else rsrr[1][i]=th;

    for(int i=1;i<=m;i++) rsrr[i][1]=rsrr[1][1];

    for(int i=2;i<=m;i++)
    {
        for(int j=2;j<=l;j++)
        {
            ma=max(rsrr[i-1][j],rsrr[i][j-1]);
            if(like[i]==give[j]) rsrr[i][j]=++ma;
            else rsrr[i][j]=ma;
        }
    }

    printf("%d\n",ma);

    return 0;
}

 

你可能感兴趣的:(#,ACM,#,PTA,#,技巧题集)