【CF1141F1】Same Sum Blocks

题目大意:给定一个 N 个值组成的序列,求序列中区间和相同的不相交区间段数量的最大值。

题解:设 (dp[i][j]) 表示到区间 [i,j] 时,与区间 [i,j] 的区间和相同的不相交区间数量是多少。可以枚举之前的区间进行状态转移,时间复杂度为 (O(n^4))

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=51;

int n,ans,x,y,a[maxn],sum[maxn],dp[maxn][maxn];
struct node{int l,r;}pre[maxn][maxn];

void dfs(int i,int j){
	if(!i)return;
	dfs(pre[i][j].l,pre[i][j].r);
	printf("%d %d
",i,j);
}

void solve(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++){
			dp[i][j]=0;
			int ch=sum[j]-sum[i-1];
			for(int l=1;l<i;l++)
				for(int r=l;r<i;r++)if(ch==sum[r]-sum[l-1])
					if(dp[l][r]>dp[i][j]){
						dp[i][j]=dp[l][r];
						pre[i][j]=node{l,r};
					}
			++dp[i][j];
			if(dp[i][j]>ans)ans=dp[i][j],x=i,y=j;
		}
	printf("%d
",ans);
	dfs(x,y);
}

int main(){
	solve();
	return 0;	
}
原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10567631.html