文章目录
- 题目描述
- 解析
- 代码
- thanks for reading!
题目描述
一代炉石的眼泪啊
解析
用dp[i][j]表示i与j之间的全部消掉(不含两端)的最小花费
然后枚举中间最后杀死的狼就行了
本题没有一次AC,因为一开始dp定义成了包含两端,然后因为还受再外面的影响,写的很乱
一次不成后经过思考,啊哈! 正解思路就诞生了
所以寻找适用与题目的dp定义非常重要
正如之前的积木消消乐一样
代码
#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=600;
const int M=2e6+100;
int m,n;
ll dp[N][N];//dp[i][j]:把i与j之间的全部消掉(不含两端)
int a[N],b[N],h[N],x;
int seil(int x,int y){return x%y==0?x/y:x/y+1;
}
ll find(int st,int ed){if(dp[st][ed]) return dp[st][ed];if(st==ed-1) return 0;ll ans=2e17;for(int i=st+1;i<ed;i++){ans=min(ans,find(st,i)+find(i,ed)+seil(h[i],x)*(a[i]+b[st]+b[ed]));//枚举最后消掉的狼 }return dp[st][ed]=ans;
}
int main(){scanf("%d%d",&n,&x);for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&h[i]);printf("%lld",find(0,n+1));return 0;
}