这题的样例输出应该是16,但这份code会给出18。如果直接交一发就会得到30pts的好成绩。 经过检查,发现f[3][3][1][2]的值是13,实际上应该是12,且错误出现在这一句前后。
f[i][j][k][0]=max(f[i][j][k-1][2],max(f[i][j][k-1][1],f[i][j][k-1][0])); //不涂
此时的i,j,k为3,3,2。
也就是说在取max时f[3][3][1][2]变大了。 同样的,所有换行处的f[i][j][1][2]都变大了
怎么汇市呢?
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=51,M=2501;
int n,m,t,f[M][N][N][2];
bool g[N][N];
char c;
int main()
{
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>c,g[i][j]=c-'0';
for(int i=1;i<=t;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
{
if(k==1) //换行
{
f[i][j][k][0]=max(f[i][j-1][m][0],max(f[i][j-1][m][1],f[i][j-1][m][2])); //不涂
f[i][j][k][1]=max(f[i-1][j-1][m][0],max(f[i-1][j-1][m][1],f[i-1][j-1][m][2]))+1; //正确
f[i][j][k][2]=max(f[i-1][j-1][m][0],max(f[i-1][j-1][m][1],f[i-1][j-1][m][2])); //错误
}
else
{
f[i][j][k][0]=max(f[i][j][k-1][2],max(f[i][j][k-1][1],f[i][j][k-1][0])); //不涂
if(g[j][k]==g[j][k-1]) f[i][j][k][1]=max(f[i-1][j][k-1][2],max(f[i][j][k-1][1],f[i-1][j][k-1][0]))+1; //相同且正确
else f[i][j][k][1]=max(f[i-1][j][k-1][1],max(f[i-1][j][k-1][0],f[i][j][k-1][2]))+1; //不同且正确
if(g[j][k]==g[j][k-1]) f[i][j][k][2]=max(f[i-1][j][k-1][1],max(f[i-1][j][k-1][0],f[i][j][k-1][2])); //相同且错误
else f[i][j][k][2]=max(f[i][j][k-1][1],max(f[i-1][j][k-1][2],f[i-1][j][k-1][0])); //不同且错误
}
}
for(int i=1;i<=t;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
for(int w=0;w<=2;w++)
printf("%d %d %d %d: %d\n",i,j,k,w,f[i][j][k][w]);
cout<<max(f[t][n][m][0],max(f[t][n][m][1],f[t][n][m][2]))<<endl;
}
/*
3 6 3
111111
000000
001100
*/