首页 > 代码库 > codeforces2B - The least round way DP
codeforces2B - The least round way DP
题意:给你一个矩阵,问你从左上角走一直走到右下角只能向右向下,问你最后乘起来尾数0个数最少的数值和路径是什么
解题思路:可以知道 要么这条路径上和 的质因子 2 的个数 < 5的个数, 要么 5的个数 < 2 的个数,所以就在一个节点里面添加两个信息,一种是2最小 ,一种是5最小,
最开始没注意看数据 莫名 RE 31组数据,然后发现有0,这里特判一下就行了,写了200行也是给自己跪了。
解题代码:
1 // File Name: 2b.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月02日 星期六 15时17分39秒 4 5 #pragma comment(linker, "/STACK:102400000,102400000") 6 #include<vector> 7 #include<list> 8 #include<map> 9 #include<set> 10 #include<deque> 11 #include<stack> 12 #include<bitset> 13 #include<algorithm> 14 #include<functional> 15 #include<numeric> 16 #include<utility> 17 #include<sstream> 18 #include<iostream> 19 #include<iomanip> 20 #include<cstdio> 21 #include<cmath> 22 #include<cstdlib> 23 #include<cstring> 24 #include<ctime> 25 #pragma comment(linker, "/STACK:102400000,102400000") 26 #define LL long long 27 using namespace std; 28 #pragma comment(linker, "/STACK:102400000,102400000") 29 30 struct node2{ 31 LL n2 ; 32 LL n5 ; 33 bool d; 34 }; 35 struct node{ 36 node2 m[2]; 37 }dp[1004][1004]; 38 LL l2[100]; 39 LL l5[100]; 40 int nl2; 41 int nl5; 42 void init() 43 { 44 memset(dp,0,sizeof(dp)); 45 l2[1] = 2; 46 l5[1] = 5; 47 for(int i = 2;;i ++) 48 { 49 l2[i] = l2[i-1]*2; 50 if(l2[i] > 1e9) 51 { 52 nl2 = i ; 53 break; 54 } 55 } 56 for(int i = 2;;i ++) 57 { 58 l5[i] = l5[i-1]*5; 59 if(l5[i] > 1e9) 60 { 61 nl5 = i ; 62 break; 63 } 64 } 65 } 66 void solve(int x,int y ,LL t) 67 { 68 int t2 ; 69 int t5 ; 70 for(int i =1 ;;i ++) 71 { 72 if(t % l2[i] != 0 ) 73 { 74 t2 = i-1; 75 break; 76 } 77 } 78 for(int i =1 ;;i ++) 79 { 80 if(t % l5[i] != 0 ) 81 { 82 t5 = i-1; 83 break; 84 } 85 } 86 dp[x][y].m[0].n2 = t2; 87 dp[x][y].m[0].n5 = t5; 88 dp[x][y].m[1] = dp[x][y].m[0]; 89 } 90 int num; 91 bool ans[2000004] = {0}; 92 bool d; 93 void findway(int x, int y ) 94 { 95 num --; 96 if((x == 1 && y == 1)) 97 return; 98 99 if(dp[x][y].m[d].d)100 {101 ans[num] = 1;102 findway(x,y-1);103 return;104 }else{105 findway(x-1,y);106 return;107 }108 }109 void dp_clear(int x, int y)110 {111 dp[x][y].m[0].n2 = 1e9;112 dp[x][y].m[0].n5 = 1e9;113 dp[x][y].m[0].d = 0;114 dp[x][y].m[1] = dp[x][y].m[0];115 }116 LL a[1005][1005];117 int main(){118 int n ;119 init();120 scanf("%d",&n);121 num = 2*n-1;122 int ok = 0;123 int x, y;124 for(int i = 1;i <= n;i ++)125 for(int j = 1;j <= n ;j ++ )126 {127 128 LL temp ; 129 scanf("%I64d",&a[i][j]);130 if(a[i][j] != 0 )131 solve(i,j,a[i][j]);132 else{133 ok = 1;134 x = i; 135 y = j;136 }137 }138 for(int i = 2;i <= n;i ++)139 {140 dp[1][i].m[0].n2 = dp[1][i-1].m[0].n2 + dp[1][i].m[0].n2;141 dp[1][i].m[0].n5 = dp[1][i-1].m[0].n5 + dp[1][i].m[0].n5;142 dp[1][i].m[0].d = 1; 143 dp[1][i].m[1] = dp[1][i].m[0]; 144 }145 for(int i = 2;i <= n;i ++)146 {147 dp[i][1].m[0].n2 = dp[i-1][1].m[0].n2 + dp[i][1].m[0].n2;148 dp[i][1].m[0].n5 = dp[i-1][1].m[0].n5 + dp[i][1].m[0].n5;149 dp[i][1].m[1] = dp[i][1].m[0]; 150 }151 for(int i =2;i <= n;i ++)152 for(int j = 2;j <= n;j ++)153 {154 if(a[i][j] == 0 )155 {156 dp_clear(i,j);157 continue;158 }159 if(dp[i-1][j].m[0].n2 < dp[i][j-1].m[0].n2)160 {161 dp[i][j].m[0].n2 += dp[i-1][j].m[0].n2;162 dp[i][j].m[0].n5 += dp[i-1][j].m[0].n5;163 }else{164 dp[i][j].m[0].n2 += dp[i][j-1].m[0].n2;165 dp[i][j].m[0].n5 += dp[i][j-1].m[0].n5;166 dp[i][j].m[0].d = 1; 167 }168 if(dp[i-1][j].m[1].n5 < dp[i][j-1].m[1].n5)169 {170 dp[i][j].m[1].n2 += dp[i-1][j].m[1].n2;171 dp[i][j].m[1].n5 += dp[i-1][j].m[1].n5;172 }else{173 dp[i][j].m[1].n2 += dp[i][j-1].m[1].n2;174 dp[i][j].m[1].n5 += dp[i][j-1].m[1].n5;175 dp[i][j].m[1].d = 1; 176 }177 }178 LL T = min(min(dp[n][n].m[0].n2,dp[n][n].m[0].n5),min(dp[n][n].m[1].n2,dp[n][n].m[1].n5));179 if(ok)180 {181 if(T!= 0 )182 {183 printf("1\n");184 for(int i = 1;i < x;i ++)185 printf("D");186 for(int i = 1;i < n;i ++)187 printf("R");188 for(int i = x+1;i <=n;i ++)189 printf("D");190 printf("\n");191 return 0 ; 192 }193 }194 printf("%I64d\n",T);195 d = 0; 196 if(min(dp[n][n].m[0].n2,dp[n][n].m[0].n5) > min(dp[n][n].m[1].n2,dp[n][n].m[1].n5))197 { 198 d = 1;199 findway(n,n);200 }201 else findway(n,n);202 for(int i = 1;i <= 2*n-2;i++)203 if(ans[i])204 printf("R");205 else printf("D");206 printf("\n");207 return 0;208 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。