标签:tar set eps 证明 ima start 函数 party ide
http://acm.hdu.edu.cn/showproblem.php?pid=3506
dp[i][j]表示第i--j堆合并成一堆的时候,所需的最小花费。
然后根据以前的,dp[i][j] = dp[i][k] + dp[k + 1][j] + cost
那么我就要去找那个位置k。
能够证明的就是,cost满足四边形不等式。
我们设w[i][j]表示第i--j个数的和。
引用一下:
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <assert.h> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> int n; const int maxn = 2e3 + 20; int dp[maxn][maxn]; int s[maxn][maxn]; int sum[maxn]; int a[maxn]; void work() { for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); a[i + n] = a[i]; } n *= 2; for (int i = 1; i <= n; ++i) { dp[i][i] = 0; s[i][i] = i; sum[i] = sum[i - 1] + a[i]; } for (int dis = 1; dis <= n - 1; ++dis) { for (int be = 1; be + dis <= n; ++be) { int en = be + dis; int tk = s[be][en]; dp[be][en] = inf; for (int k = s[be][en - 1]; k <= s[be + 1][en]; ++k) { if (k + 1 > en) break; int add = dp[be][k] + dp[k + 1][en] + sum[en] - sum[be - 1]; if (dp[be][en] > add) { dp[be][en] = add; tk = k; } } s[be][en] = tk; } } int ans = inf; for (int i = 1; i <= n / 2; ++i) { ans = min(ans, dp[i][i + n / 2 - 1]); } cout << ans << endl; } int main() { #ifdef local freopen("data.txt", "r", stdin); // freopen("data.txt", "w", stdout); #endif while (scanf("%d", &n) != EOF) work(); return 0; }
http://www.cnblogs.com/zxndgv/archive/2011/08/02/2125242.html
hdu 3506 Monkey Party 区间dp + 四边形不等式优化
标签:tar set eps 证明 ima start 函数 party ide
原文地址:http://www.cnblogs.com/liuweimingcprogram/p/6225458.html