这题完全没往dp上面想 害 有时候贪心和dp 还是很难分的开 该dp的写贪心大概率是只过样例的 一个比较好的方法是 看数据范围 但是这个也不完全准确 至于一些更进阶的方法 我也不晓得啊 有时候想个贪心也不知道对不对 想错误样例也想不到位 害 wo太难了
这题对于每个区间找出d的最大值 然后枚举这个最大值对应的l和r作为决策点
就行了
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r,d;
}p[303];
int b[609],tot,dp[605][605];
const int inf = 0x3f3f3f3f;
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(dp,0,sizeof(dp));
int n;
tot=0;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].d);
b[++tot]=p[i].l,b[++tot]=p[i].r;
}
sort(b+1,b+1+tot);
tot=unique(b+1,b+1+tot)-b-1;
for(int i = 1; i <= n; i++){
p[i].l=lower_bound(b+1,b+1+tot,p[i].l)-b;
p[i].r=lower_bound(b+1,b+1+tot,p[i].r)-b;
}
for(int len = 1; len <= tot; len++){
for(int l = 1; l <= tot-len+1; l++){
int r = l+len-1,id = 0;
for(int i = 1; i <= n; i++){
if(p[i].l>=l&&p[i].r<=r)
if(id==0||p[i].d>p[id].d)
id=i;
}
if(id==0) dp[l][r]=0;
dp[l][r]=inf;
for(int i = l; i <= r; i++)
dp[l][r]=min(dp[l][i-1]+p[id].d+dp[i+1][r],dp[l][r]);
}
}
printf("%d\n",dp[1][tot]);
}
return 0;
}