F怎么做F怎么做F怎么做F怎么做F怎么做F怎么做F怎么做
  • 板块学术版
  • 楼主Lysea
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/7/1 01:45
  • 上次更新2024/7/1 11:40:24
查看原帖
F怎么做F怎么做F怎么做F怎么做F怎么做F怎么做F怎么做
616733
Lysea楼主2024/7/1 01:45

区间dp无果。

#include<bits/stdc++.h>
#define int long long
#define N 305
#define lowbit(x) (x&(-x))
using namespace std;
int T,n,a[N],f[N][N][N];
int dfs(int l,int r,int k){
	if(f[l][r][k]!=-1) return f[l][r][k];
	if(l>=r) return 0;
	f[l][r][k]=0;
	for(int p=l;p<r;p++){
		if(a[p]==p-k){
			f[l][r][k]=max(f[l][r][k],dfs(l,p-1,k)+dfs(p+2,r,k+2)+1);
			for(int w=p-1;w>=l;w--){
				if(a[w]-k!=w||2*p>r+w-1) break;
				f[l][r][k]=max(f[l][r][k],dfs(l,w-1,k)+dfs(2*p+2-w,r,k+2*(p-w+1))+1+p-w);
			}
		}
	}
	cout<<l<<" "<<r<<" "<<k<<" "<<f[l][r][k]<<endl;
	return f[l][r][k];
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		for(int i=0;i<=2*n;i++){
			for(int j=0;j<=2*n;j++){
				for(int k=0;k<=2*n;k++)
					f[i][j][k]=-1;
			}
		}
		cout<<dfs(1,n,0)<<endl;
	}
	return 0;
} 
2024/7/1 01:45
加载中...