错误处在区间dp的注释下面,我改成另一种区间dp就过了(第二种代码)但是两种写法应该没有区别啊,我不太明白为什么,然后上面这段代码怎么也改不对,有佬能帮帮的话非常感谢
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=655;
const int inf=1e9;
ll read(){
ll ret=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') ret=ret*10+c-'0',c=getchar();
return ret;
}
//void read(char a[]){
// char c=getchar();
// int j=1;
// while(c<'a'||c>'z') c=getchar();
// while(c>='a'&&c<='z') a[j++]=c,c=getchar();
//}
struct Alien{
int l,r,d;
}a[maxn];
int que[10005],q_cnt,dp[maxn][maxn];
int main(){
int t=read();
while(t--){
int n=read();
//离散化
q_cnt=0;
memset(dp,0,maxn);
for(int i=1;i<=n;i++){
a[i].l=read(),a[i].r=read(),a[i].d=read();
que[++q_cnt]=a[i].l,que[++q_cnt]=a[i].r;
}
sort(que+1,que+q_cnt+1);
q_cnt=unique(que+1,que+q_cnt+1)-que-1;
for(int i=1;i<=n;i++){
//mistake只求位数不求值,离散化
a[i].l=lower_bound(que+1,que+q_cnt+1,a[i].l)-que;
a[i].r=lower_bound(que+1,que+q_cnt+1,a[i].r)-que;
}
int cnt=q_cnt;
//区间dp
int ans=inf;
for(int i=cnt-1;i>=1;i--){
for(int j=i;j<=cnt;j++){
int p=0;
for(int k=1;k<=n;k++)
if(a[k].l>=i&&a[k].r<=j&&a[k].d>a[p].d)p=k;
if(!p){
dp[i][j]=0;
continue;
}
dp[i][j]=inf;
for(int k=a[p].l;k<=a[p].r&&k<j;k++){
if(k-1<i)continue;
dp[i][j]=min(dp[i][j],dp[i][k-1]+a[k].d+dp[k+1][j]);
}
}
}
cout<<dp[1][cnt]<<endl;
}
}
ac的区间dp(除了放出来的部分都和上面一样)这个是看题解改的
//区间dp
int ans=inf;
for(int w=0;w<cnt;++w)
{
for(int s=1;s+w<=cnt;++s)
{
int e=s+w,id=-1;
for(int i=1;i<=n;++i)if(s<=a[i].l&&a[i].r<=e&&(id==-1||a[i].d>a[id].d))id=i;
if(id==-1){ dp[s][e] = 0;continue;}
dp[s][e]=inf;
for(int k=a[id].l;k<=a[id].r;++k) dp[s][e]=min(dp[s][e],dp[s][k-1]+a[id].d+dp[k+1][e]);
}
}