CF2B The least round way
Posted qyj060604
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF2B The least round way相关的知识,希望对你有一定的参考价值。
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掉
以上是关于CF2B The least round way的主要内容,如果未能解决你的问题,请参考以下文章
[CF2B] The least round way - dp
codeforces 2B The least round way
code force 2B The least round way