CF2B The least round way
样例
3
1 2 3
4 5 6
7 8 9
0
DDRR
题解
CODE
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N][N][2];
int main(){
int n;
scanf("%d", &n);
int pos = -1, x;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
scanf("%d", &x);
if(x == 0){
pos = i;
continue;
}
int t = x;
while(t % 2 == 0){
dp[i][j][0]++;
t /= 2;
}
t = x;
while(t % 5 == 0){
dp[i][j][1]++;
t /= 5;
}
}
}
for(int i = 2; i <= n; i++){
dp[i][1][0] += dp[i - 1][1][0];
dp[i][1][1] += dp[i - 1][1][1];
dp[1][i][0] += dp[1][i - 1][0];
dp[1][i][1] += dp[1][i - 1][1];
}
for(int i = 2; i <= n; i++){
for(int j = 2; j <= n; j++){
dp[i][j][0] += min(dp[i-1][j][0], dp[i][j-1][0]);
dp[i][j][1] += min(dp[i-1][j][1], dp[i][j-1][1]);
}
}
string ans;
int k = 0;
if(dp[n][n][0] > dp[n][n][1]){
k = 1;
}
if(pos != -1 && dp[n][n][k] > 0){
printf("1\n");
for(int i = 1; i < pos; i++){
printf("D");
}
for(int i = 1; i < n; i++){
printf("R");
}
for(int i = pos; i < n; i++){
printf("D");
}
return 0;
}
int i = n, j = n;
while(true){
if(dp[i - 1][j][k] < dp[i][j - 1][k]){
i--;
ans += "D";
}else{
j--;
ans += "R";
}
if(i == 1){
for(int x = 1; x < j; x++) ans += "R";
break;
}
if(j == 1){
for(int x = 1; x < i; x++) ans += "D";
break;
}
}
printf("%d\n", dp[n][n][k]);
for(int i = ((int)ans.length() - 1); i >= 0; i--){
printf("%c", ans[i]);
}
return 0;
}
没有未来的未来不是我想要的未来

浙公网安备 33010602011771号