4212:Candy

問題文
https://icpcarchive.ecs.baylor.edu/external/42/4212.pdf

n*mのグリッドが与えられる。マスの数字はそのマスにあるキャンディーの個数だ。このグリッドのあるマスからそのマスにあるキャンディーを全てとるとき、図のようにそのマスの左右のマスと上下の列にあるキャンディーがすべて消えてしまう。取れるキャンディーの最大値を求めよ。









































まず全ての行について、その行で取れるキャンディーの最大値を計算する。
dp[ マスの番号 ] := そのマスまでで取れるキャンディーの最大値
dp[ i ] = max( dp[ i - 1 ], dp[ i - 2 ] + w[ i ] )

それができたら、今度は各行での最大値に対して同じことをする。

#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
int main(void){
 
  int n,m;
  while(cin >> n >> m,n|m){
    int g[n+2],v[m+2];
    fill(g,g+n+2,0);
    
    for(int i=1;i<=n;i++){
      fill(v,v+m+2,0);
      for(int j=1;j<=m;j++)cin >> v[j];
      vector<int> dp(m+2);
      dp[0]=0,dp[1]=v[1];
      for(int j=2;j<=m;j++)
	dp[j] = max(dp[j-1], dp[j-2]+v[j]);
      
      g[i]=dp[m];
    }
    
    vector<int> dp(n+2);
    dp[0]=0,dp[1]=g[1];
    for(int j=2;j<=n;j++)
      dp[j] = max(dp[j-1], dp[j-2]+g[j]);
    
    cout << dp[n] << endl;
  }
  return 0;
}