【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\n",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\n",ans);
    dfs(x,y);
}

int main(){
    solve();
    return 0;   
}

猜你喜欢

转载自www.cnblogs.com/wzj-xhjbk/p/10567631.html