玄关求调
查看原帖
玄关求调
550579
GSRgsrgsr楼主2024/3/19 12:46
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=305,M=1e4+5;
struct node{
	int a,b,d;
}w[N];
int c[M],num[N*2],f[N*2][N*2];
bool cmp(int x,int y){
	return x<y;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,tot=0,cnt=0;
		scanf("%d",&n);
		for(int i=1;i<=n;++i){
			scanf("%d%d%d",&w[i].a,&w[i].b,&w[i].d);
			c[++tot]=w[i].a;
			c[++tot]=w[i].b;
		}
		sort(c+1,c+tot+1,cmp);
		for(int i=1;i<=tot;++i)if(c[i]!=c[i-1])num[c[i]]=++cnt;
		for(int i=1;i<=n;++i){
			w[i].a=num[w[i].a];
			w[i].b=num[w[i].b];
		}
		for(int len=1;len<=tot;++len){
			for(int l=1,r=len;r<=tot;++l,++r){
				int mx=0;
				for(int k=1;k<=n;++k)if(l<=w[k].a&&w[k].b<=r&&(w[k].d>w[mx].d||mx==0))mx=k;
				if(!mx){
					f[l][r]=0;
					continue;
				}
				f[l][r]=1e9;
				for(int k=w[mx].a;k<=w[mx].b;++k)f[l][r]=min(f[l][r],f[l][k-1]+f[k+1][r]+w[mx].d);
			}
		}
		printf("%d\n",f[1][tot]);
	}
	return 0;
}
2024/3/19 12:46
加载中...