Codeforces_327A(前缀+区间DP)

Posted 偶尔爆零的蒟蒻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces_327A(前缀+区间DP)相关的知识,希望对你有一定的参考价值。


题意

给定一个序列,只有01,必须选定一个区间取反,求最多有几个1


找到一个区间(0的个数减1的个数之差最大),加上之前的的1个数即可

//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
#define ff first
#define ss second
#define ms(x) memset(x,0,sizeof(x))
typedef long long ll;
typedef pair<int,int> pii;
#define inf 0x3f3f3f3f  //10 6110 9567<2^30=10 7374 1824
#define iinf 0x7fffffff //
const int mod=1e9+7;
const int MAX=1e5;
int dp[101][101];
int a[101];
int sum0[101];
int sum1[101];
//第一感觉区间dp,找到一个区间,其0、1个数差最大
//凭感觉AC了,很开心
int main()
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
    int n,c=0;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
        sum0[i]=sum0[i-1];//前缀0个数
        sum1[i]=sum1[i-1];//前缀1个数
        if(!a[i])sum0[i]++;
        else
            c++;
            sum1[i]++;
        
    
    for(int k=0;k<n;k++)
        for(int i=1;i+k<=n;i++)
            int j=i+k;
            for(int r=i;r<=j;r++)
                dp[i][j]=max(max(dp[i+1][r],dp[i][r]),sum0[j]-sum0[i-1]-sum1[j]+sum1[i-1]);
            
        
    
    if(n==c)cout<<n-1;//特判全1
    else cout<<c+dp[1][n];



以上是关于Codeforces_327A(前缀+区间DP)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces1312E Array Shrinking 区间DP

Codeforces 332B Maximum Absurdity(DP+前缀和处理)

CodeForces 327E Axis Walking(状压DP+卡常技巧)

Codeforces 934C - A Twisty Movement

[区间DP] Tinkoff Challenge - Elimination Round D题

Codeforces Round #635 (Div. 2) E——Kaavi and Magic Spell 区间dp