hdu5115(区间dp)

来源:互联网 发布:js中什么是构造函数 编辑:程序博客网 时间:2024/05/16 05:21

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115

题意:有n只狼站在一排,每只狼都有自己的基础伤害的额外伤害。如果你杀死一只狼,那么你将承受这只狼的基础伤害加上相邻两只狼的额外伤害。现在让你求出将这些狼全部杀死所承受的最小伤害。

思路:看见n不大那么直接想到区间dp(好吧,其实最先想到的是贪心),dp[i][j]表示杀死[i,j]区间狼承受的最小伤害,由于杀死最后一只狼只会受到他自己的基础伤害,所以想到了枚举杀死最后一只狼k,这样,状态转移方程就出来了:dp[i][j]=min(dp[i][j],dp[i][k-1]+a[k]+dp[k+1][j]+b[i-1]+b[j+1]);答案自然就是dp[1][n]了

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=205;
const int INF=0x4fffffff;
int dp[maxn][maxn],a[maxn],b[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++) scanf("%d",&b[i]);
        for(int l=1;l<=n;l++)
        {
            for(int i=1;i<=n-l+1;i++)
            {
                int j=i+l-1;
                dp[i][j]=INF;
                for(int k=i;k<=j;k++)
                {
                    dp[i][j]=min(dp[i][j],dp[i][k-1]+a[k]+dp[k+1][j]+b[i-1]+b[j+1]);
                }
            }
        }
        static int t=1;
        printf("Case #%d: %d\n",t++,dp[1][n]);
    }
    return 0;
}

原创粉丝点击