#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; }
HDU - 4960 Another OCD Patient——dp
猜你喜欢
转载自blog.csdn.net/hao_zong_yin/article/details/80159778
今日推荐
周排行