andre_joy

导航

hdu 4283

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

题意:一些人排好序,然后先进黑屋子,然后再出来去舞台,黑屋子是相当于一个栈,先进后出,每个人去舞台都有一个不开心值,求不开心值最小的做法。

mark:记忆化搜索。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>

int min(int a, int b) {return a < b ? a : b;}

const int INF = 10000000;
int d[110], sum[110][110];
int dp[110][110];

int solve(int l, int r)
{
    if(dp[l][r] != -1) return dp[l][r];
    if(l == r) return 0;
    int ans1, ans2;
    ans1 = INF;
    for(int i = l; i < r; i++)   //枚举黑屋子里面没人的点。 
        ans1 = min(ans1, solve(l, i) + solve(i+1, r) + (i-l+1)*sum[i+1][r]);
    ans2 = solve(l+1, r) + (r-l)*d[l];   //黑屋子里面始终有人。 
    return dp[l][r] = min(ans1, ans2);
}

int main()
{
    int t, n;
    scanf("%d", &t);
    for(int p = 1; p <= t; p++)
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
            scanf("%d", d+i);
        for(int i = 1; i <= n; i++)
            for(int j = i; j <= n; j++)
            {
                sum[i][j] = 0;
                for(int k = i; k <= j; k++)
                    sum[i][j] += d[k];
            }
        memset(dp, -1, sizeof(dp));
        printf("Case #%d: %d\n", p, solve(1, n));
    }
    return 0;
}

posted on 2012-09-11 21:56  andre_joy  阅读(327)  评论(0编辑  收藏  举报