一本通OJ-恐狼后卫

恐狼后卫

题意

有一个攻击值\(atk\),攻击狼需要攻击至0血以下。耗费的代价是\((a[i]+b[i-1]+b[i+1])*times\)。求最小代价。

分析

\(Notice\):注意消去时$cost=times[k]*(a[ k ]+ b[ l - 1 ] + b[ r + 1 ] ) $注意要想让它变为-血需要 \(h[i]+atk-1\) 下取整

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=1e3+7;
int n,atk;
int a[N],b[N],h[N],times[N],f[N][N];
signed main(){
    scanf("%lld%lld",&n,&atk);
    cerr<<n<<" "<<atk<<" ";
    for(int i=1;i<=n;i++){
        scanf("%lld%lld%lld",&a[i],&b[i],&h[i]);
        cerr<<a[i]<<" "<<b[i]<<" "<<h[i]<<" ";
        // h[i]--;
    }
    for(int i=1;i<=n;i++){
        int x=(int)ceil((h[i]+atk-1)/atk);//防止不小于0
        // printf("需要%d次\n",x);
        times[i]=x;f[i][i]=x*(a[i]+b[i+1]+b[i-1]);
    }
    for(int len=2;len<=n;len++){
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            f[l][r]=0x3f3f3f3f;
            for(int k=l;k<=r;k++){
                int cost=times[k]*(a[k]+b[l-1]+b[r+1]);
                f[l][r]=min(f[l][r],f[l][k-1]+f[k+1][r]+cost);
            }
        }
    }
    printf("%lld",f[1][n]);
    return 0;
}
posted @ 2023-07-25 13:52  Zimo_666  阅读(12)  评论(0编辑  收藏  举报