light oj 1037 状压dp

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <queue>
 5 #include <cstdio>
 6 #include <algorithm>
 7 #include <map>
 8 //#include <time.h>
 9 //#include <ext/pb_ds/assoc_container.hpp>
10 //#include <ext/pb_ds/tree_policy.hpp>
11 #define LL long long
12
13 using namespace std;
14 //using namespace __gnu_pbds;
15
16 int dp[1<<20];
17
18 int attack[20][20],health[20];
19
20 int n;
21
22 int check(int j,int i)
23 {
24     int a = 1;
25     a = max(a,attack[j][i]);
26     return (health[i]/a) + (health[i]%a?1:0);
27 }
28
29 int dfs(int statu)
30 {
31     if(dp[statu] != -1)
32         return dp[statu];
33     dp[statu] = 0x3f3f3f3f;
34     if(statu == 0)
35         return dp[statu] = 0;
36     for(int i = 1; i <= n; i++)
37     {
38         if( ((statu>>(i-1))&1) == 0 )
39             continue;
40         dp[statu] = min(dp[statu],dfs( (statu^(1<<(i-1))))+health[i]/1);
41         for(int j = 1; j <= n; j++)
42         {
43             if(i == j) continue;
44
45             if( ((statu>>(j-1))&1) == 0)
46             {
47                 dp[statu] = min(dp[statu],dfs( (statu^(1<<(i-1)) )) + check(j,i) );
48             }
49         }
50
51     }
52
53     return dp[statu];
54 }
55
56 void solve()
57 {
58     memset(dp,-1,sizeof(dp));
59
60     scanf("%d",&n);
61     for(int i = 1; i <= n; i++)
62         scanf("%d",&health[i]);
63     for(int i = 1; i <= n; i++)
64         for(int j = 1; j <= n; j++)
65             scanf("%1d",&attack[i][j]);
66
67     int ans =  dfs( (1<<n)-1);
68
69     printf("%d\n",ans);
70 }
71
72
73 int main(void)
74 {
75     int t,cnt = 0;
76     scanf("%d",&t);
77     while(t--)
78     {
79         printf("Case %d: ",++cnt);
80         solve();
81     }
82     return 0;
83 }
时间: 2024-10-06 01:00:13

light oj 1037 状压dp的相关文章

light oj 1057 状压dp TSP

1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <queue> 5 #include <cstdio> 6 #include <algorithm> 7 #include <map> 8 //#include <time.h> 9 //#include <ext/pb_ds/assoc_container

西电oj 1038 状压dp

西电oj 1038  状压dp 1038: 裁玻璃 时间限制: 1 Sec  内存限制: 128 MB提交: 33  解决: 4[提交][状态][讨论版] 题目描述 张老板的玻璃店开张了,生意火爆.今天,隔壁玻璃店的刘老板拿来一块玻璃,意在刁难张老板.刘老板说:“我这块玻璃是由N(行)*M(列)小正方形玻璃拼成的,但是其中有一些玻璃坏了,我希望你现在把它裁成尽量多的2*2的小玻璃,而且这些小玻璃都不能有坏的地方.如果你裁出来的块数不是最多的,我就把你赶出建材市场.”现在,张老板来拜托你帮他解决这

(九度OJ)题目1338:角斗士(状压DP)

题目描述: 角斗士是古罗马奴隶社会的一种特殊身份的奴隶,他们的职责是在角斗场上进行殊死搏斗,为了人们提供野蛮的娱乐.他们的结局或是战死,或者由于表现突出赢得胜利而获得释放. 现在在角斗场里有N个待战的角斗士(1 <=N<=18),每天都将举行一场比赛,为了保持比赛的刺激性,每场比赛前才会在所有当前活着的角斗士之中随机选择两名进行上场拼杀.每场比赛的结束条件即为其中一名被杀死.当进行了N场比赛之后,最后存活的角斗士将被释放.而你将被赋予一个任务,计算出每名角斗士最终存活的概率.我们将提供角斗士之

ZOJ3305Get Sauce 状压DP,

状压DP的题目留个纪念,首先题意一开始读错了,搞了好久,然后弄好了,觉得DFS可以,最后超时,修改了很久还是超时,没办法看了一下n的范围,然后觉得状压可以,但是没有直接推出来,就记忆化搜索了一下,可是一直错,莫名奇妙,然后没办法看了一下题解,发现了下面这个比较好的方法,然后按照这个方程去推,然后敲,也是WA了好多把,写的太搓了,没人家的清楚明了,唉~也算是给自己留个纪念,状压一直做的都不太好~唉~还好理解了, 参考了  http://blog.csdn.net/nash142857/articl

poj 2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12232   Accepted: 7142 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

HDU5816 Hearthstone(状压DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collectible card game from Blizzard Entertainment. Strategies and luck are the most important factors in this game. When you suffer a desperate situation an

HDU 4336 容斥原理 || 状压DP

状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示什么都不取得概率,p(x1)表示的是取x1的概率,最后要加一因为有又多拿了一次.整理一下就可以了. 1 #include <cstdio> 2 const int Maxn=23; 3 double F[1<<Maxn],p[Maxn]; 4 int n; 5 int main() 6

Travel(HDU 4284状压dp)

题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走,一个城市只能工作一次,问pp是否能游览n个城市回到城市1. 分析:这个题想到杀怪(Survival(ZOJ 2297状压dp) 那个题,也是钱如果小于0就挂了,最后求剩余的最大钱数,先求出最短路和 Hie with the Pie(POJ 3311状压dp) 送披萨那个题相似. #include <