第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");
}
}
}
}