• 【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;	
    }
    
  • 相关阅读:
    Python下载安装
    批量修改样式及全选反选
    小99
    练习题
    练习
    对象、函数
    操作document对象练习
    练习题
    0513-2
    0513-1
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10567631.html
Copyright © 2020-2023  润新知