hdu 4049 2011北京赛区网络赛J 状压dp ***

cl少用在for循环里

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 typedef long long ll;
 13 #define cl(a) memset(a,0,sizeof(a))
 14 #define ts printf("*****\n");
 15 const int MAXN=15;
 16 int n,m,tt;
 17 int dp[15][1<<12],cost[MAXN],in[MAXN][MAXN],a[MAXN][MAXN],st[MAXN];
 18 int main()
 19 {
 20     int i,j,k,ca=1;
 21     #ifndef ONLINE_JUDGE
 22     freopen("1.in","r",stdin);
 23     #endif
 24     while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
 25     {
 26         for(i=1;i<=m;i++)scanf("%d",cost+i);
 27         for(i=1;i<=n;i++)
 28             for(j=1;j<=m;j++)   scanf("%d",&in[i][j]);
 29         for(i=1;i<=n;i++)    //陪同
 30         {
 31             for(j=1;j<=n;j++)    scanf("%d",&a[i][j]);
 32         }
 33         //dp初始化
 34         for(i=1;i<=m;i++)
 35         {
 36             for(j=0;j<=(1<<n)-1;j++)    dp[i][j]=-10000000;
 37         }
 38         for(i=0;i<=(1<<n)-1;i++)    dp[0][i]=0;
 39         for(i=1;i<=m;i++)
 40         for(j=0;j<=(1<<n)-1;j++)
 41         {
 42             int tot=0;
 43             //当前状态取得的值
 44             int temp=j;
 45             for(k=1;k<=n;k++)
 46             {
 47                 st[k]=temp%2;
 48                 if(st[k])   tot+=(in[k][i]-cost[i]);
 49                 temp/=2;
 50             }
 51             //printf("%d\n",tot);
 52             //陪伴加成
 53             for(k=1;k<=n;k++)
 54             {
 55                 for(int kk=k+1;kk<=n;kk++)
 56                 {
 57                     if(st[k]&&st[kk])
 58                     {
 59                         tot+=a[k][kk];
 60                     }
 61                 }
 62             }
 63             //之前的转态
 64             int ans=1;  //状态总和
 65             int pre[1<<12];
 66             pre[0]=j;
 67             for(k=1;k<=n;k++)
 68             {
 69                 if(!st[k])  //该人当前未出现,则之前可能是出现也可能是没出现
 70                 {
 71                     int sum=ans;
 72                     for(int kk=0;kk<ans;kk++)
 73                     {
 74                         int nst=pre[kk]^(1<<(k-1));
 75                         pre[sum++]=nst;
 76                     }
 77                     ans=sum;
 78                 }
 79             }
 80             //加上之前的转态
 81             int Max=-10000000;
 82             for(k=0;k<ans;k++)
 83             {
 84                 if(Max<dp[i-1][pre[k]])
 85                 {
 86                     Max=dp[i-1][pre[k]];
 87                 }
 88             }
 89             dp[i][j]=Max+tot;
 90         }
 91         int Max=-10000000;
 92         for(i=1;i<=m;i++)
 93         {
 94             for(j=0;j<=(1<<n)-1;j++)
 95             {
 96                 if(Max<dp[i][j])    Max=dp[i][j];
 97             }
 98         }
 99         if(Max<=0)   printf("STAY HOME\n");
100         else    printf("%d\n",Max);
101     }
102 }
时间: 2024-10-07 18:55:20

hdu 4049 2011北京赛区网络赛J 状压dp ***的相关文章

hdu 4050 2011北京赛区网络赛K 概率dp ***

题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到达这个格子 1:表示左脚跳进这个格子 2:表示右脚跳进这个格子 3:随意哪个脚跳进这个格子,而且下一步随意用哪个脚 dp[i][j] :表示走到第 i 个格子在 j 状态的期望. 当j=1时,你可以走到dp[i+k][2],dp[i+k][3], 当j=2时,你可以走到dp[i+k][1],dp[i

hdu 4044 2011北京赛区网络赛E 树形dp ****

专题训练 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1010; 7 const int INF=0x3fffffff; 8 struct Node 9 { 10 int to; 11 int next; 12 }edge[MAXN*2]; 13 int t

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 4046 2011北京赛区网络赛G 线段树 ***

还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w 1 #include<cstdio> 2 #include<cstring> 3 #define lson l,m,rt<<1 4 #define rson m+1,r,rt<<1|1 5 using namespace std; 6 const int maxn=50010; 7 int n,m,sum[maxn<<2]; 8 char str[ma

hdu 4041 2011北京赛区网络赛B 搜索 ***

直接在字符串上搜索,注意逗号的处理 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 #define pb

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000

hdu 4031 2011成都赛区网络赛A题 线段树 ***

就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9