HDU - 4960 Another OCD Patient——dp

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5010;
int n, v[maxn], a[maxn], dp[maxn];
int dfs(int l, int r) {
    if (l >= r) return 0;
    if (~dp[l]) return dp[l];
    int &ans = dp[l] = a[r-l+1];
    long long sum1 = 0, sum2 = 0;
    for (int i = r, j = l-1; ; i--) {
        sum1 += v[i];
        while (sum2 < sum1 && j < i) sum2 += v[++j];
        if (j >= i) break;
        if (sum2 == sum1) ans = min(ans, dfs(j+1, i-1) + a[r-i+1] + a[j-l+1]);
    }
    return ans;
}
int main() {
    while (~scanf("%d", &n) && n) {
        for (int i = 1; i <= n; i++) scanf("%d", &v[i]);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        memset(dp, -1, sizeof(dp));
        printf("%d\n", dfs(1, n));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/80159778
今日推荐