版权声明: https://blog.csdn.net/Dream_Weave/article/details/82109373
题目链接:点击打开链接
题目大意:略。
解题思路:找规律: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 |
扫描二维码关注公众号,回复:
2905382 查看本文章
注意:WA 代码 与 AC 代码区别是:WA代码先手动初始化(1,1)开始,再自动填充;而AC代码是利用外围的(0,0)直接自动填充;如图所示有一种情况WA代码(码如其名):
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#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<bits/stdc++.h>
#include<cmath>
#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;
}