zoukankan      html  css  js  c++  java
  • 入门OJ:photo

    题目描述

    有N个人,来自K个家族.他们排成一行准备照相,但是由于天生的排外性,每个人都希望和本家族的人站在一起,中间不要加入别的家族的人.问最少从队列中去掉多少个就可以达到这个目的.

    输入格式

    第一行给出N,K。N在[1,100],K在[1,5]

    第二行给出N个数,每个数为1到K中的某个数。

    输出格式

    最少从队列中去掉多少个就可以达到这个目的


    显然对于当前第i个点我们可以做两个操作:留下或者删去。

    如果留下,就会有两种情况:第i个人和上一个留下的人属于同一个家族。第二种情况是不属于同一个家族,那么我们的状态需要从当前有人留下的家族转移过来。

    如果删去则不需要考虑任何东西。

    综合上面的分析,可以知道我们需要的信息有:当前是第几个人,当前选了那些家族,处理完当前人之后最后一个留下的人的家族。

    那么可以设计出这样的状态:dp(i,j,k),表示当前为第i个人,当前选的家族情况的二进制表示为j,最后一个留下的人的家族为k。设第i个人的家族为col,那么可以得出状态转移方程:

    [dp[i][j][col]=Max_{1≤k≤K}{{}dp[i-1][j{wedge}R(1<<col)][k]+1{}} ]

    初始化都为0,答案为n-Max{dp(n,i,j)}

    时间复杂度为O(NK * 2^K)。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define maxn 101
    #define maxm 6
    using namespace std;
     
    int dp[maxn][1<<maxm][maxm];
    int n,m,ans;
    inline int read(){
        register int x(0),f(1); register char c(getchar());
        while(c<'0'||'9'<c){ if(x=='-') f=-1; c=getchar(); }
        while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
     
    int main(){
        //freopen("photo.in","r",stdin);
        //freopen("photo.out","w",stdout);
        n=read(),m=read();
         
        for(register int i=1;i<=n;i++){
            int col=read()-1;
            memcpy(dp[i],dp[i-1],sizeof dp[i-1]);
            for(register int j=0;j<1<<m;j++) if(j&(1<<col)){
                dp[i][j][col]=max(dp[i][j][col],dp[i-1][j][col]+1);
                for(register int k=0;k<m;k++){
                    dp[i][j][col]=max(dp[i][j][col],dp[i-1][j^(1<<col)][k]+1);
                }
            }
        }
        for(register int i=0;i<1<<m;i++){
            for(register int j=0;j<m;j++){
                ans=max(ans,dp[n][i][j]);
            }
        }
        printf("%d
    ",n-ans);
        return 0;
    }
    
  • 相关阅读:
    第025讲:字典:当索引不好用时 | 课后测试题及答案
    第023、024讲:递归:这帮小兔崽子、汉诺塔 | 课后测试题及答案
    第022讲:函数:递归是神马
    第021讲:函数:lambda表达式
    第020讲:函数:内嵌函数和闭包
    第019讲:函数:我的地盘听我的
    第018讲:函数:灵活即强大
    第017讲:函数
    第016讲:序列!序列
    第015讲:字符串:格式化
  • 原文地址:https://www.cnblogs.com/akura/p/11045948.html
Copyright © 2011-2022 走看看