競技プログラミング日記

主に AtCoder の記事です

第六回 アルゴリズム実技検定 I問題

 

PAST006I


実装上の注意
同じ場所で2回釣らないこと.
(今のマスで釣ったか) \(\in Bool\) で管理した.

遷移に注意すれば,このフラグは無くてもDPは可能. その場合,(移動2種類)x(移動先で釣るor釣らない)の4通りの遷移になる. 移動で釣るかどうかを決めるのが大事.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

ll dp[220][110][110][2];

int main() {
  ll h,w; cin >> h >> w;
  vvll a(h, vll(w));
  cinvv(a);

  dp[0][0][0][0] = 0;
  rep(k,h+w){
    rep(x,h) rep(y,w){
      rep(f,2){ // 今のマスで釣ったか
        ll now = dp[k][x][y][f];
        if(x+1 < h) chmax(dp[k][x+1][y][0], now);
        if(y+1 < w) chmax(dp[k][x][y+1][0], now);
        if(!f) chmax(dp[k+1][x][y][1], now + a[x][y]);
      }

    }
  }

  rep1(k,h+w-1){
    ll ans = 0;
    rep(f,2) chmax(ans, dp[k][h-1][w-1][f] );
    cout << ans << endl;
  }

  return 0;
}