zoukankan      html  css  js  c++  java
  • HDU 5115 Dire Wolf(区间dp)

    题目链接

    题目大意

      有n头狼排成一排,每只狼两个属性,攻击力和加成值,狼的实际攻击力等于自身攻击力加相邻狼的加成值,被杀死之后的狼对相邻的狼的攻击力的加成会被取消,同时,原先与 被杀死的狼相邻的两头狼会变成相邻的狼。问杀死所有狼受到的伤害值最小值。

    解题思路

      首先可以看出来第一行的数字对决策没什么影响,直接累加起来就是了。然后就是怎么决策的问题,一开始我以为是贪心找价值最大的点结果wa了。。。然后考虑区间dp。
      这题区间dp的写法很简单,就是依次枚举区间的分割点然后进行合并就行了。

    代码

    const int maxn = 2e2+10;
    const int maxm = 1e4+10;
    ll a[maxn], b[maxn], dp[maxn][maxn]; 
    int n, k;
    int main() {
        int t; cin >> t;
        while(t--) {
            scanf("%d", &n);
            ll ans = 0;
            for (int i = 1; i<=n; ++i) {
                scanf("%lld", &a[i]); ans += a[i];
            }
            for (int i = 1; i<=n; ++i) scanf("%lld", &b[i]);
            for (int i = 1; i<=n; ++i)
                for (int j = 1; j<=n; ++j)
                    dp[i][j] = INF;
            for (int i = 1; i<=n; ++i) dp[i][i] = b[i-1]+b[i+1];
            for (int len = 1; len<=n; ++len) {
                for (int l = 1; l+len<=n; ++l) {
                    int r = l+len;
                    dp[l][r] = min(dp[l+1][r]+b[l-1]+b[r+1], dp[l][r-1]+b[l-1]+b[r+1]);
                    for (int k = l+1; k+1<=r; ++k) dp[l][r] = min(dp[l][r], dp[l][k-1]+dp[k+1][r]+b[l-1]+b[r+1]);
                }
            }
            printf("Case #%d: %lld
    ", ++k, ans+dp[1][n]);
        }
        return 0;  
    }
    
  • 相关阅读:
    移动端图片按比例裁剪
    bootstrap悬停下拉菜单显示
    videojs兼容ie8
    ie浏览器不支持多行隐藏显示省略号
    rem和px
    浏览器默认返回,页面刷新
    centos src compile gcc 7.3
    docker与gosu
    centos 安装 kernel
    docker proxy
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/13660526.html
Copyright © 2011-2022 走看看