一个很诡异的现象
查看原帖
一个很诡异的现象
546944
Kuroneko楼主2022/11/16 16:29

这题的样例输出应该是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
*/
2022/11/16 16:29
加载中...