您的位置:首页 > 其它

HDU 4283 - You Are the One(区间DP)

2015-08-07 22:49 435 查看
题目:

http://acm.hdu.edu.cn/showproblem.php?pid=4283

用两种形式写了一下。。

AC。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 105;
int v[maxn], sum[maxn];
int dp[maxn][maxn];

int dfs(int l, int r)
{
if(l > r) return 0;
if(dp[l][r] != inf) return dp[l][r];
for(int i = l; i <= r; ++i) {
int cnt = dfs(l+1, i) + dfs(i+1, r) + v[l]*(i-l) + (i-l+1)*(sum[r]-sum[i]);
dp[l][r] = min(dp[l][r], cnt);
}
return dp[l][r];
}
int main()
{
int T, ca = 1;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
sum[0] = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
sum[i] = sum[i-1] + v[i];
}

memset(dp, inf, sizeof(dp));
dfs(1, n);
printf("Case #%d: %d\n", ca++, dp[1]
);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 105;
int val[maxn], sum[maxn];
int dp[maxn][maxn];

int main()
{
//freopen("in", "r", stdin);
int T, ca = 1;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
sum[0] = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &val[i]);
sum[i] = sum[i-1] + val[i];
}

memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++i) {
for(int j = i+1; j <= n; ++j) {
dp[i][j] = inf;
}
}

for(int j = 1; j <= n; ++j) {
for(int i = j; i >= 1; --i) {
for(int k = 1; k <= j-i+1; ++k) {
dp[i][j] = min(dp[i][j],
dp[i+1][i+k-1]+val[i]*(k-1)+dp[i+k][j]+k*(sum[j]-sum[i+k-1]));
}
}
}
printf("Case #%d: %d\n", ca++, dp[1]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU