首页 > 代码库 > HDU 2280 状压DP
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 }
HDU 2280 状压DP
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。