codeforces1286 A.Garland

题意:ios

有一个数组,包含乱序1-n的元素,而且有些数被从数组中拿出,如今问怎样将这些数放回才能使,相邻两数为奇偶的对数最小数组

思路:spa

定义dp[i][j][k]为到n这个位置放了j个偶数最后一位为奇数或偶数code

那么转移方程为:blog

令t=dp[i-1][j][k]string

i.奇数:dp[i][j][1]=max(dp[i][j][1],t+(k!=1))it

ii.偶数:dp[i][j+1][0]=max(dp[i][j][0],t+(k!=0))io

#include<iostream>
#include<algorithm>
#include<cstring>
#define inf 0x3f3f3f3f
 using namespace std;
 const int maxn=110;
 int dp[maxn][maxn][3],a[maxn],n;
 int main()
 {
     int n,num=0;
     scanf("%d",&n);
     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    num=n/2;
    memset(dp,inf,sizeof(dp));
    dp[0][0][0]=dp[0][0][1]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<i;j++){
            for(int k=0;k<2;k++){
                int t=dp[i-1][j][k];
                if(a[i]){
                    if(a[i]%2) dp[i][j][1]=min(dp[i][j][1],t+(k!=1));
                    else dp[i][j+1][0]=min(dp[i][j+1][0],t+(k!=0));
                }
                else{
                    for(int l=0;l<2;l++)
                        dp[i][j+1-l][l]=min(dp[i][j+1-l][l],t+(l!=k));
                }
            }
        }
    }
    printf("%d\n", min(dp[n][num][0], dp[n][num][1]));
 }
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息