zoukankan      html  css  js  c++  java
  • 2019年第十届蓝桥杯省赛-糖果(一维状压dp)

    看到20的数据量很容易想到状压dp。

    开1<<20大小的数组来记录状态,枚举n个糖包,将其放入不同状态中(类似01背包思想)

    时间复杂度O(n*(2^20))。

    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
    
        static Scanner sc = new Scanner(System.in);
        static int[][] a = new int[105][25];
        static int[] sta = new int[105];
        static int[] dp = new int[(1<<20)+5];
        
        public static void main(String[] args) {
            
            int n=sc.nextInt();
            int m=sc.nextInt();
            int k=sc.nextInt();
            Arrays.fill(dp, -1);
            dp[0]=0;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=k;j++){
                    a[i][j]=sc.nextInt();
                    sta[i]|=1<<(a[i][j]-1);
                }
                dp[sta[i]]=1;
            }
            for(int i=1;i<=n;i++){
                for(int j=0;j<(1<<m);j++){
                    if(dp[j]==-1) continue;
                    if(dp[j|sta[i]]==-1||dp[j]+1<dp[j|sta[i]]){
                        dp[j|sta[i]]=dp[j]+1;
                    }
                }
            }
            System.out.println(dp[(1<<m)-1]);
        }
    
    }
  • 相关阅读:
    ES6模块开发+单文件组件
    Vue路由学习
    Vuex学习
    Vue组件
    Vue事件处理
    Git下载前后端代码步骤
    小黑记事本
    简单计算器
    ubuntu的基础命令
    拓扑排序以及求解关键路径
  • 原文地址:https://www.cnblogs.com/yzm10/p/10657812.html
Copyright © 2011-2022 走看看