1126:The Secret Number
問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1126
上と左の数の後ろにのみ現在の数をつけることができる。最大の数字を出力せよ。
動的計画法。
dp[ y ][ x ]:=最大の数字の文字列
grid[ y ][ x ]:=入力
とすると
dp[y][x]=max( dp[ y ][ x ], dp[ y-1 ][ x ], dp[ y ][ x-1 ] ) + grid[ y ][ x ]
#include<iostream> #include<string> #include<algorithm> #include<cctype> using namespace std; string max(string a, string b){ if(a.size()>b.size()) return a; if(a.size()<b.size()) return b; for(int i=0;i<a.size();i++){ if(a[i] > b[i]) return a; if(a[i] < b[i]) return b; } return a; } int main(void){ int w,h; string grid[71],dp[71][71]; while(cin >> w >> h,w|h){ for(int i=0;i<71;i++) for(int j=0;j<71;j++)dp[i][j].clear(); for(int i=0;i<h;i++)cin >> grid[i]; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ if(!isupper(grid[i][j])){ dp[i][j]=grid[i][j]; string a="",b=""; if(i>0)a=dp[i-1][j]+grid[i][j]; if(j>0)b=dp[i][j-1]+grid[i][j]; while(a[0]=='0')a.erase(a.begin()); while(b[0]=='0')b.erase(b.begin()); dp[i][j]=max(dp[i][j],max(a,b)); } } } string s=""; for(int i=0;i<h;i++) for(int j=0;j<w;j++)s=max(s,dp[i][j]); cout << s << endl; } return 0; }