motu*2

DIV1目指して問題を解き続ける

AOJ 0089 The Shortest Path on A Rhombic Path

概要

ひし形上に並べられた整数が与えられる。
一番上から左下か右下に移動していったとき、
通過した整数の和の最大値を出力せよ。

解法

動的計画法で解く。

コード

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <string>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n)  FOR(i,0,n)

vector<int> parse(string s, char c) {
    int pre = 0;
    vector<int> v;
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == c) {
            v.push_back(atoi(s.substr(pre, i - pre).c_str()));
            pre = i + 1;
        }
    }
    v.push_back(atoi(s.substr(pre, s.length() - pre).c_str()));
    return v;
}

int main()
{
    int m[100][100], mx, sz;
    string s;
    REP(i, 100) REP(j, 100) m[i][j] = -1;
    for (sz = 0; getline(cin, s); sz++) {
        vector<int> v = parse(s, ',');
        REP(i, v.size()) m[sz][i] = v[i];
    }
    int dp[100][100] = { m[0][0] };
    for (int i = 1; i < sz; i++) {
        if (i >= sz / 2) {
            for (int j = 0; j < i + 1; j++) {
                dp[i][j] = m[i][j] + max(dp[i - 1][j], dp[i - 1][j + 1]);
            }
        }
        else {
            for (int j = 0; j < sz - i; j++) {
                dp[i][j] = m[i][j] + max(dp[i - 1][j - 1], dp[i - 1][j]);
            }
        }
    }
    cout << dp[sz - 1][0] << endl;
    return 0;
}