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

来源:互联网 发布:淘宝买家如何升级星级 编辑:程序博客网 时间:2024/05/29 08:14

题目:

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][n]);    }    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][n]);    }    return 0;}



0 0
原创粉丝点击