Codeforces 2B (DP)

来源:互联网 发布:农产品b2c网站数据库 编辑:程序博客网 时间:2024/04/28 16:18

http://codeforces.com/contest/2/problem/B

    这题是一道比较简单的dp,只要分别处理因子2和因子5的情况就行了,状态转移方程很简单:dp2[i][j]=min(dp2[i-1][j],dp2[i][j-1])+fact(a[i][j],2),其中fact(x,p)函数代表x里有多少个因子p。5的情况也同理,最后把两个情况的答案取min就行了。唯一要注意的是0,如果原数组里有0而答案大于1,就应输出1和过0的路径。

AC代码:

#include <cassert>#include <cctype>#include <cerrno>#include <cfloat>#include <ciso646>#include <climits>#include <clocale>#include <cmath>#include <csetjmp>#include <csignal>#include <cstdarg>#include <cstddef>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <algorithm>#include <bitset>#include <complex>#include <deque>#include <exception>#include <fstream>#include <functional>#include <iomanip>#include <ios>#include <iosfwd>#include <iostream>#include <istream>#include <iterator>#include <limits>#include <list>#include <locale>#include <map>#include <memory>#include <new>#include <numeric>#include <ostream>#include <queue>#include <set>#include <sstream>#include <stack>#include <stdexcept>#include <streambuf>#include <string>#include <typeinfo>#include <utility>#include <valarray>#include <vector>#define INF 1000000007#define mp make_pair/*Problem: The least round waySource: Codeforces 2BAuthor: fts2001*/using namespace std;int n,a[1002][1002],dp2[1002][1002],dp5[1002][1002];int zx=-1,zy=-1;char prev2[1002][1002],prev5[1002][1002];inline int fact(int x,int p){if(!x)return INF;int tmp=p,res=0;while(x%tmp==0){res++;tmp*=p;}return res;}inline void print2(int x,int y){if(x!=1 || y!=1){if(prev2[x][y]=='D')print2(x-1,y);else print2(x,y-1);}else return;cout<<prev2[x][y];}inline void print5(int x,int y){if(x!=1 || y!=1){if(prev5[x][y]=='D')print5(x-1,y);else print5(x,y-1);}else return;cout<<prev5[x][y];}int main(){ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}for(int i=0;i<=n;i++){dp2[0][i]=dp5[0][i]=INF;dp2[i][0]=dp5[i][0]=INF;}dp2[0][1]=dp5[0][1]=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dp2[i][j]=min(dp2[i-1][j],dp2[i][j-1])+fact(a[i][j],2);//if(dp2[i][j]>INF)dp2[i][j]=INF;if(dp2[i-1][j]<dp2[i][j-1]){prev2[i][j]='D';}else{prev2[i][j]='R';}dp5[i][j]=min(dp5[i-1][j],dp5[i][j-1])+fact(a[i][j],5);//if(dp5[i][j]>INF)dp5[i][j]=INF;if(dp5[i-1][j]<dp5[i][j-1]){prev5[i][j]='D';}else{prev5[i][j]='R';}if(!a[i][j]){zx=i;zy=j;}}}int ans=min(dp2[n][n],dp5[n][n]);if(zx!=-1 && zy!=-1 && ans>1){cout<<1<<endl;for(int i=1;i<zx;i++){cout<<'D';}for(int i=1;i<n;i++){cout<<'R';}for(int i=zx;i<n;i++){cout<<'D';}cout<<endl;}else{cout<<ans<<endl;if(ans==dp2[n][n]){print2(n,n);}else{print5(n,n);}cout<<endl;}return 0;}


0 0
原创粉丝点击