CF 2 B(dp)
2013-08-03 13:40
316 查看
一道dp例题,给出一个矩阵,要找到从左上到右下的一条路径,使这条路径上的数相乘的结果的末尾0的个数最少。先考虑整个矩阵的数都是正的。dp[i][j]要记录两个值,到这一点2的最少个数和5的最少个数,最后答案就是两者的较小值。再考虑如果有0,那答案最大为1。
#include <iostream> #include <string> #include <map> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; typedef long long LL; const int maxn = 1000 + 5; const int INF = 1000000000; const int Mod = 1000000 + 3; int a[maxn][maxn]; int dp2[maxn][maxn],dp5[maxn][maxn]; int back2[maxn][maxn],back5[maxn][maxn]; vector<char> v; int main(){ int n; while(scanf("%d",&n) != EOF){ int tag = 0; for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++) scanf("%d",&a[i][j]); } memset(dp2,0,sizeof(dp2)); memset(dp5,0,sizeof(dp5)); v.clear(); for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ if(i == 1){ dp2[i][j] = dp2[i][j-1]; dp5[i][j] = dp5[i][j-1]; back2[i][j] = back5[i][j] = 1; } else if(j == 1){ dp2[i][j] = dp2[i-1][j]; dp5[i][j] = dp5[i-1][j]; back5[i][j] = back2[i][j] = 0; } else{ dp2[i][j] = min(dp2[i-1][j],dp2[i][j-1]); if(dp2[i-1][j] < dp2[i][j-1]) back2[i][j] = 0; else back2[i][j] = 1; dp5[i][j] = min(dp5[i-1][j],dp5[i][j-1]); if(dp5[i-1][j] < dp5[i][j-1]) back5[i][j] = 0; else back5[i][j] = 1; } int tem = a[i][j]; while(tem%2 == 0 && tem != 0){ dp2[i][j]++; tem /= 2; } while(tem%5 == 0 && tem != 0){ dp5[i][j]++; tem /= 5; } } } int ans = min(dp2 ,dp5 ); if(dp2 < dp5 ){ int x = n,y = n; while(x != 1 || y != 1){ if(back2[x][y] == 1){ v.push_back('R'); y--; } else{ v.push_back('D'); x--; } } reverse(v.begin(),v.end()); } else{ int x = n,y = n; while(x != 1 || y != 1){ if(back5[x][y] == 1){ v.push_back('R'); y--; } else{ v.push_back('D'); x--; } } reverse(v.begin(),v.end()); } if(ans > 1){ for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ if(a[i][j] == 0){ ans = 1; v.clear(); for(int u = 1;u < i;u++) v.push_back('D'); for(int u = 1;u < j;u++) v.push_back('R'); for(int u = i;u < n;u++) v.push_back('D'); for(int u = j;u < n;u++) v.push_back('R'); break; } } } } printf("%d\n",ans); for(int i = 0;i < v.size();i++) printf("%c",v[i]); printf("\n"); } return 0; }
相关文章推荐
- CF 417D - Cunning Gena--状态压缩DP
- CF 254E Dormitory(DP)
- CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)
- CF-14E - Camels(DP)
- CF 311B Cats Transport(单调队列优化DP)
- CF - 474 - D. Flowers(dp)
- CF 148D. Bag of mice[概率dp]
- CF825F:String Compression(dp & kmp)
- CF 946D. Timetable 暴力+DP
- CF 259div2 D (状态压缩dp)
- cf 429B Working out(简单dp)
- toj 4074 CF 319C 斜率优化dp
- CF:Problem 385C - Bear and Prime Numbers 预处理DP
- CF 55D - Beautiful numbers(数位DP)
- 第八届山东省赛 sdut 3903 CF(贪心+dp)
- CF 161D Distance in Tree 树形DP(套路,路径长度为k点对)
- 严格上升子序列 dp CF Round_FF div1 A
- cf 758 D Ability To Convert (dp)
- cf RCC 2014 Warmup (D题 关于搜索和dp的选择的理解)
- CF 407B Long Path[观察性质 DP]