题目链接:点击打开链接
题目大意:略。
解题思路:找规律: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代码(码如其名):
AC 代码
usingnamespacestd; typedeflonglongll; constintM=210, L=1e4+10; intlike[M], give[L], rsrr[M][L]; intmain() { intn,m,l,ma; scanf("%d%d",&n,&m); for(inti=1;i<=m;i++) scanf("%d",&like[i]); scanf("%d",&l); for(inti=1;i<=l;i++) scanf("%d",&give[i]); for(inti=1;i<=m;i++) { for(intj=1;j<=l;j++) { ma=max(rsrr[i-1][j],rsrr[i][j-1]); if(like[i]==give[j]) rsrr[i][j]=++ma; elsersrr[i][j]=ma; } } printf("%d\n",ma); return0; }
WA 代码
usingnamespacestd; typedeflonglongll; constintM=210, L=1e4+10; intlike[M], give[L], rsrr[M][L]; intmain() { intn,m,l,ma; scanf("%d%d",&n,&m); for(inti=1;i<=m;i++) scanf("%d",&like[i]); scanf("%d",&l); for(inti=1;i<=l;i++) scanf("%d",&give[i]); intth=0; for(inti=1;i<=l;i++) if(like[1]==give[i]) rsrr[1][i]=++th; elsersrr[1][i]=th; for(inti=1;i<=m;i++) rsrr[i][1]=rsrr[1][1]; for(inti=2;i<=m;i++) { for(intj=2;j<=l;j++) { ma=max(rsrr[i-1][j],rsrr[i][j-1]); if(like[i]==give[j]) rsrr[i][j]=++ma; elsersrr[i][j]=ma; } } printf("%d\n",ma); return0; }