TopCoder Open 2012 Round 1C Div1 Medium PasswordXGrid
問題
hxwのグリッドがあり、(0,0)から右か下へ移動することを繰り返し、(h,w)へ移動する。
それぞれの辺には1から9までの数字が割り振られている。
どのような経路をたどっても、ゴールへ移動するまでに通った辺の数字の和が一定になるように、辺の数字を変えたい。
辺の数字は、好きな正の整数だけ増やすことができる。(増やさなくてもよい)
ゴールへ移動するまでに通る辺の数字の和の最小値を求めよ。
制約条件
h,w≦50
方針
実はゴールまでの最長距離に合わせられるらしい。
Editorialの証明には、
longest(i,j)を、(i,j)からゴールまでの最長距離とすると、
longest(i,j) + e(i,j,i+1,j)≦ longest(i+1,j)が成り立つので、
eをlongest(i+1,j) - longest(i,j)へ変えることができる。
と書いてあった。
eを変えたらlongestも変わるんじゃないの?ってことで微妙に納得がいかない。
ソースコード
class PasswordXGrid { public: int minSum(vector <string> horizontal, vector <string> vertical) { int w=vertical[0].size(), h = horizontal.size(); int dp[50][50] = {}; for(int i = h-1; i >= 0; i--) for(int j = w-1; j >= 0; j--){ if(i) dp[i-1][j] = max(dp[i-1][j], dp[i][j] + vertical [i-1][j] - '0'); if(j) dp[i][j-1] = max(dp[i][j-1], dp[i][j] + horizontal[i][j-1] - '0'); } return dp[0][0]; } };