看不懂错误显示了
查看原帖
看不懂错误显示了
141599
sinsop90楼主2022/4/19 12:15

第27个点WA, 他说答案的第一行3381, 我输出了5646, 但我去cf上看了一下, 好像我输出的就是3381啊..

还是说我第二行输出错了?

#include <bits/stdc++.h>
#define maxn 1005
using namespace std;
int n, a[maxn][maxn], sum[maxn][maxn][2], f[maxn][maxn][2][2], ans[2005], tot, t;
int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= n;j++) {
			scanf("%d", &a[i][j]);
			if(a[i][j] == 0) {
				sum[i][j][0] = 1, sum[i][j][1] = 1;
				t = i;
			}
			else {
				while(a[i][j] % 2 == 0) sum[i][j][0] ++, a[i][j] >>= 1;
				while(a[i][j] % 5 == 0) sum[i][j][1] ++, a[i][j] /= 5;
			}
		}
	}
	for(int i = 1;i <= n;i++) {
		f[1][i][0][0] = f[1][i - 1][0][0] + sum[1][i][0];
		f[1][i][1][0] = f[1][i - 1][1][0] + sum[1][i][1];
		f[1][i][0][1] = f[1][i][1][1] = 0;
		f[i][1][0][0] = f[i - 1][1][0][0] + sum[i][1][0];
		f[i][1][1][0] = f[i - 1][1][1][0] + sum[i][1][1];
		f[i][1][0][1] = f[i][1][1][1] = 1;
	}
	for(int i = 2;i <= n;i++) {
		for(int j = 2;j <= n;j++) {
//			if(i == 1 && j == 1) continue;
			f[i][j][0][0] = min(f[i - 1][j][0][0], f[i][j - 1][0][0]) + sum[i][j][0];
			f[i][j][1][0] = min(f[i - 1][j][1][0], f[i][j - 1][1][0]) + sum[i][j][1];
			if(f[i - 1][j][0][0] < f[i][j - 1][0][0]) {
				f[i][j][0][1] = 1;
			}
			else f[i][j][0][1] = 0;
			if(f[i - 1][j][1][0] < f[i][j - 1][1][0]) {
				f[i][j][1][1] = 1;
			}
			else f[i][j][0][1] = 0;
		}
	}
	int ansn = min(f[n][n][0][0], f[n][n][1][0]);
//	for(int i= 1;i <= n;i++) {
//		for(int j = 1;j <= n;j++) cout << f[i][j][0][0] << " ";
//		cout << endl;
//	}
//	for(int i= 1;i <= n;i++) {
//		for(int j = 1;j <= n;j++) cout << sum[i][j][0] << " ";
//		cout << endl;
//	}
	if(ansn && t) {
		puts("1");
		for(int i = 1;i <= t - 1;i++) printf("D");
		for(int i = 1;i <= n - 1;i++) printf("R");
		for(int i = 1;i <= n - t;i++) printf("D");
	}
	else {
		printf("%d\n", ansn);
		if(f[n][n][0][0] < f[n][n][1][0]) {
			int x = n, y = n;
			while(!(x == 1 && y == 1)) {
				
				if(f[x][y][0][1] == 1) {
					ans[++tot] = 1;//D
					x --;
				}
				else ans[++tot] = 0, y --;//R
			}
			for(int i = tot;i >= 1;i--) {
				if(ans[i] == 1) printf("D");
				else printf("R");
			}
		}
		else {
			int x = n, y = n;
			while(!(x == 1 && y == 1)) {
//				cout << x << " " << y << endl;
				if(f[x][y][1][1] == 1) {
					ans[++tot] = 1;//D
					x --;
				}
				else ans[++tot] = 0, y --;//R
			}
			for(int i = tot;i >= 1;i--) {
				if(ans[i] == 1) printf("D");
				else printf("R");
			}
		}
	}
}
2022/4/19 12:15
加载中...