CF2B The least round way
message1:
脚造的垃圾hack数据:
3
0 1 1
1 1 1
1 1 1
ans:
1
DDRR
数据2:
3
0 1 1
1 1 0
1 1 1
ans:
1
DDRR
dp
0由2×5组成
预处理每个位置2因子、5因子个数
f[i][j][k]表示dp到(i,j),k因子至少有几个
输出路径只要倒着dfs一遍即可
代码:
#include<bits/stdc++.h> using namespace std; int n; int s[1005][1005][2]={0}; int g[1005][1005][2]={0};//-1:no 0:up 1:left bool flag=0; int xx,yy; void get(int i,int j,int x){ int cnt1=0,cnt2=0; while(x%2==0) x/=2,cnt1++; while(x%5==0) x/=5,cnt2++; s[i][j][0]=cnt1,s[i][j][1]=cnt2; } void print(int x,int y,int k,int F){ if(x==1&&y==1) ; else if(x==1) print(x,y-1,k,0); else if(y==1) print(x-1,y,k,1); else{ if(g[x][y][k]==g[x][y-1][k]+s[x][y][k]) print(x,y-1,k,0); else print(x-1,y,k,1); } if(F==0) printf("R"); else if(F==1) printf("D"); } int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int x; scanf("%d",&x); if(x==0){ flag=1; s[i][j][0]++,s[i][j][1]++; xx=i,yy=j; } else{ get(i,j,x); } } } memset(g,127,sizeof(g)); g[1][1][0]=s[1][1][0]; g[1][1][1]=s[1][1][1]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==1&&j==1) continue; int a,b; a=g[i-1][j][0],b=g[i][j-1][0]; if(a<b){ g[i][j][0]=a+s[i][j][0]; } else{ g[i][j][0]=b+s[i][j][0]; } a=g[i-1][j][1],b=g[i][j-1][1]; if(a<b){ g[i][j][1]=a+s[i][j][1]; } else{ g[i][j][1]=b+s[i][j][1]; } } } if(min(g[n][n][0],g[n][n][1])>1&&flag){ printf("1\n"); for(int i=1;i<xx;i++) printf("D"); for(int i=1;i<yy;i++) printf("R"); for(int i=xx+1;i<=n;i++) printf("D"); for(int i=yy+1;i<=n;i++) printf("R"); return 0; } printf("%d\n",min(g[n][n][0],g[n][n][1])); if(g[n][n][0]<g[n][n][1]) print(n,n,0,233); else print(n,n,1,233); return 0; }
但是这份代码还是会被前面的hack数据给hack掉
原文地址:https://www.cnblogs.com/QYJ060604/p/11426844.html
时间: 2024-10-13 20:07:32