• HDU 2280 状压DP


    用dfs找到状态的最优解

    且那个正方形块可以由两个水平块组成,所以无需考虑

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 
     5 using namespace std;
     6 #define N 1005
     7 int state[N] , n , m , dp[N][1<<6];
     8 
     9 void dfs(int i , int k , int state1 , int state2 , int v)
    10 {
    11     if(k > 5){
    12         dp[i][state2] = max(dp[i][state2] , v);
    13         return;
    14     }
    15     if(k <= 4){
    16         if(!(state1&(1<<k-1)) && !(state2&(3<<k-1))){
    17             dfs(i , k+1 , state1 | (1<<k-1) , state2 | (3<<k-1) , v+3);
    18         }
    19         if(!(state1&(1<<k)) && !(state2&(3<<k-1))){
    20             dfs(i , k+1 , state1 | (1<<k) , state2 | (3<<k-1) , v+3);
    21         }
    22         if(!(state1&(3<<k-1)) && !(state2&(1<<k-1))){
    23             dfs(i , k+1 , state1 | (3<<k-1) , state2 | (1<<k-1) , v+3);
    24         }
    25         if(!(state1&(3<<k-1)) && !(state2&(1<<k))){
    26             dfs(i , k+1 , state1 | (3<<k-1) , state2 | (1<<k) , v+3);
    27         }
    28         if(!(state2&(3<<k-1))){
    29             dfs(i , k+1 , state1 , state2 | (3<<k-1) , v+2);
    30         }
    31     }
    32     else{
    33         if(!(state1&(1<<k-1)) && !(state2&(1<<k-1))){
    34             dfs(i , k+1 , state1 | (1<<k-1) , state2 | (1<<k-1) , v+2);
    35         }
    36     }
    37     dfs(i , k+1 , state1 , state2 , v);
    38 }
    39 
    40 void dfs2(int k , int sta , int v)
    41 {
    42     if(k > 5){
    43         dp[1][sta] = max(dp[1][sta] , v);
    44         return;
    45     }
    46     if(k <= 4){
    47         if(!(sta & (3<<k-1)))
    48             dfs2(k+1 , sta | (3<<k-1) , v+2);
    49     }
    50     dfs2(k+1 , sta , v);
    51 }
    52 
    53 int main()
    54 {
    55   //  freopen("a.in" , "rb" , stdin);
    56     char a;
    57     while(scanf("%d%d", &n , &m) != EOF){
    58         memset(state , 0 ,sizeof(state));
    59         int all = 0;
    60         for(int i = 1; i <= n ; i++)
    61             for(int j=1; j<=5 ; j++){
    62                 cin>>a;
    63                 if(a == '1'){
    64                     state[i] |= (1<<j-1);
    65                 }
    66                 else all++;
    67             }
    68 
    69         memset(dp , -1 , sizeof(dp));
    70         dp[1][state[1]] = 0;
    71         dfs2(1 , state[1] , 0);
    72 
    73         for(int i=2 ; i <= n ; i++){
    74             for(int j = 0; j<(1<<5) ; j++){
    75                 if(dp[i-1][j] >= 0){
    76                     dfs(i , 1 , j , state[i] , dp[i-1][j]);
    77                 }
    78             }
    79         }
    80 
    81         int maxn = 0;
    82 
    83         for(int i = 0 ; i<(1<<5) ; i++){
    84             maxn = max(maxn , dp[n][i]);
    85         }
    86 
    87         int remain = all - maxn;
    88         if(remain <= m) puts("YES");
    89         else puts("NO");
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    LeetCode 2 -- Add Two Numbers
    LeetCode 1 -- Two Sum
    LeetCode189——Rotate Array
    Win10下IIS配置 C#项目的部署与发布
    Linux查看进程和删除进程
    使用 Visual Studio 将 ASP.NET Core 应用发布到 Linux 上的应用服务
    Spring Boot 设置启动时路径和端口号
    Linux平台部署.net Core SDK
    C#教程之如何在centos操作系统上发布.net core的项目
    Linux如何查看和控制进程
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4068979.html
Copyright © 2020-2023  润新知