码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1286A] Garland - dp

时间:2020-05-02 00:08:21      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:long   main   define   lan   eof   rip   name   else   mat   

Description

有一个由 $ 1 $ - $ n $ 构成的排列,其中部分被删除(删除的元素由 $ 0 $ 代替),请用被删除的元素补全这个数列,使这个数列中相邻元素奇偶性不同的对数最少。\(n \le 100\)

Solution

\(f[i][j][0/1]\) 表示用了 \(i\) 个奇数,\(j\) 个偶数,上一位是奇数或偶数时的最小值

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 105;

int f[N][N][2],a[N],n;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    memset(f,0x3f,sizeof f);
    f[0][0][0]=f[0][0][1]=0;
    for(int l=1;l<=n;l++) {
        for(int i=0;i<=l;i++) {
            int j=l-i;
            if(a[l]) {
                if(a[l]&1) {
                    if(i>0) f[i][j][1]=min(f[i-1][j][0]+1,f[i-1][j][1]);
                }
                else {
                    if(j>0) f[i][j][0]=min(f[i][j-1][0],f[i][j-1][1]+1);
                }
            }
            else {
                if(i>0) f[i][j][1]=min(f[i-1][j][1],f[i-1][j][0]+1);
                if(j>0) f[i][j][0]=min(f[i][j-1][0],f[i][j-1][1]+1);
            }
        }
    }
    /*for(int i=0;i<=n;i++) {
        for(int j=0;j<=n;j++) {
            cout<<f[i][j][0]<<"|"<<f[i][j][1]<<" ";
        }
        cout<<endl;
    }*/
    cout<<min(f[(n+1)/2][n/2][0],f[(n+1)/2][n/2][1]);
}

[CF1286A] Garland - dp

标签:long   main   define   lan   eof   rip   name   else   mat   

原文地址:https://www.cnblogs.com/mollnn/p/12815374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!