已经知道错误在区间dp但是只过了第二个点
查看原帖
已经知道错误在区间dp但是只过了第二个点
1030670
XSUYRL楼主2024/1/25 09:36

错误处在区间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]);
        }
    }
2024/1/25 09:36
加载中...