codeforces1286 A.Garland

题意:

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

思路:

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

那么转移方程为:

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

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

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

#include
#include
#include
#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){
            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]));
 }

 

你可能感兴趣的:(codeforces1286 A.Garland)