30pts区间dp求助!
查看原帖
30pts区间dp求助!
912779
isme1楼主2024/9/25 23:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,v[155],a[155],f[155][155],ans,d[155][155];
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			f[i][j]=-6e9-7;
		}
	}
	for(int i=1;i<=n;i++){
		cin>>v[i];
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i][i]=v[1];
		d[i][i]=1;
	}
	for(int l=2;l<=n;l++){
		for(int i=1;i+l-1<=n;i++){
			int j=i+l-1;
			if(l>=3){
				if(abs(a[i]-a[j])==1){
					f[i][j]=max(f[i][j],f[i+1][j-1]+v[2]);
				}
			}
			if(l==2){
				d[i][j]=(abs(a[i]-a[j])==1);
				f[i][j]=f[i][i]+f[j][j];
				if(d[i][j]==1){
					f[i][j]=max(f[i][j],v[2]);
				}
				continue;
			}
			if(((a[i+1]<a[i])&&(a[i+1]<a[i+2]))||d[i+1][j]==0||abs(a[i+1]-a[i])!=1){
				
			}
			else{
				d[i][j]=1;
				f[i][j]=max(f[i][j],v[l]);
			}
			if(((a[j-1]<a[j])&&(a[j-1]<a[j-2]))||d[i][j-1]==0||abs(a[j-1]-a[j])!=1){
				
			}
			else{
				d[i][j]=1;
				f[i][j]=max(f[i][j],v[l]);
			}
			for(int k=i+1;k<=j-2;k++){	
				f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);
				if(((a[k+1]<a[k])&&(a[k+1]<a[k+2]))||((a[k]<a[k-1])&&(a[k]<a[k+1]))||abs(a[k]-a[k+1])!=1||d[i][k]==0||d[k+1][j]==0){
					continue;
				}
				f[i][j]=max(f[i][j],v[l]);
				d[i][j]=1;
			}
		}
	}
	for(int l=1;l<=n;l++){
		for(int i=1;i+l-1<=n;i++){
			int j=i+l-1;
			ans=max(ans,f[i][j]);
		}
	}
	cout<<ans;
	return 0;
}
2024/9/25 23:04
加载中...