• Garland CodeForces


    题目:给一个1-n的数字序列,某些数字被移除,请重新填写这些数字使得一奇一偶的对数足够少。

    思路:dp[i][j][k][2],表示考虑前i个数,有j个奇数数,k个偶数,且最后一位是奇、偶数的最小值

    分类讨论:一、a[i]为0,即第i处数字空缺

                           dp[i][j][k][0]=min(dp[i1][j][k1][0],dp[i1][j][k1][1]+1)k>0

                           dp[i][j][k][1]=min(dp[i-1][j-1][k][0]+1,dp[i-1][j-1][k][1]),若j>0dp[i][j][k][1]=min(dp[i1][j1][k][0]+1,dp[i1][j1][k][1]),j>0

    二、若a[i]处数字不空缺

       判断a[i]处是奇数还是偶数:

              奇数:dp[i][j][k][1]=min(dp[i-1][j-1][k][0]+1,dp[i-1][j-1][k][1])dp[i][j][k][1]=min(dp[i1][j1][k][0]+1,dp[i1][j1][k][1])

              偶数:dp[i][j][k][0]=min(dp[i-1][j][k-1][1]+1,dp[i-1][j][k-1][0])dp[i][j][k][0]=min(dp[i1][j][k1][1]+1,dp[i1][j][k1][0])

    当然,前几位奇数的个数确定后,偶数的个数同样也能确定

    原文链接:https://www.ancode.club/index.php/2020/08/07/acm7/

     1 #include<iostream>
     2 #include<string.h>
     3 #include<cmath>
     4 #include<map>
     5 using namespace std;
     6 typedef long long ll;
     7 const int INF=0x3f3f3f3f;
     8 const int N=110;
     9 int n;
    10 int a[N];
    11 ll dp[N][N][N][2];//dp[i][j][k][2],表示考虑前i个数,有j个奇数数,k个偶数,且最后一位是奇、偶数的最小值。
    12 string s[1505];
    13 int main() {
    14     ios::sync_with_stdio(false);
    15     cin>>n;
    16     //前n个数 有cnt0个偶数,cnt1个奇数 
    17     int cnt0=n/2;
    18     int cnt1=n/2+n%2;
    19     memset(dp,0x3f,sizeof(dp));
    20     for(int i=1;i<=n;++i){
    21         cin>>a[i];
    22     }
    23     dp[0][0][0][0]=dp[0][0][0][1]=0;
    24     for(int i=1;i<=n;i++){
    25         for(int j=0;j<=cnt1;++j){
    26             for(int k=0;k<=cnt0;++k){
    27                 if(!a[i]){        
    28                     if(k>0) dp[i][j][k][0]=min(dp[i-1][j][k-1][0],dp[i-1][j][k-1][1]+1);
    29                     if(j>0) dp[i][j][k][1]=min(dp[i-1][j-1][k][0]+1,dp[i-1][j-1][k][1]);         
    30                 }else{
    31                     if(a[i]%2){
    32                         if(j>0) dp[i][j][k][1]=min(dp[i-1][j-1][k][0]+1,dp[i-1][j-1][k][1]);
    33                     }
    34                     else {
    35                         if(k>0) dp[i][j][k][0]=min(dp[i-1][j][k-1][1]+1,dp[i-1][j][k-1][0]);
    36                     }
    37                 }
    38             }
    39         }
    40     }
    41     cout<<min(dp[n][cnt1][cnt0][0],dp[n][cnt1][cnt0][1])<<endl;
    42     return 0;
    43 }
  • 相关阅读:
    CMS4.0——后知后觉
    《Mysql 入门很简单》(读后感②)
    《Mysql 入门很简单》(读后感①)
    Mysql 入门
    jQuery ajax中serialize()方法增加其他参数
    简单语法
    音频——H5 audio
    js 中的break continue return
    vue再次入手(数据传递②)
    vue再次入手(数据传递①)
  • 原文地址:https://www.cnblogs.com/0211ji/p/13461204.html
Copyright © 2020-2023  润新知