SRM549 Div1Medium MagicalHats
来源:互联网 发布:p2p线上平台软件 编辑:程序博客网 时间:2024/06/08 02:45
这题对于每个帽子有三种情况:
于是我们可以用
而后
代码如下:
#include<bits/stdc++.h>using namespace std;#define M 15#define N 2000005int n,m,k,num,Hcnt;int dp[N],cntx[M],cnty[M],tmp[M],val[M],Hx[M],Hy[M];char str[M];struct node{ int x,y;}Q[M];void Min(int &a,int b){ if(a==-1||a>b)a=b;}void Max(int &a,int b){ if(a<b)a=b;}void solve(int x){ memset(Hx,0,sizeof(Hx)); memset(Hy,0,sizeof(Hy)); int Coin=k,Hat=Hcnt,Cnt=num; for(int i=0;i<Hcnt;i++){ if(x/tmp[i]%3){ Hat--; Cnt--; } if(x/tmp[i]%3==2){ Coin--; Hx[Q[i].x]++; Hy[Q[i].y]++; } } if(Hat<Coin)return; if(!Coin){ for(int i=0;i<n;i++) if((Hx[i]+cntx[i])%2)return; for(int i=0;i<m;i++) if((Hy[i]+cnty[i])%2)return; dp[x]=0; return; } int res=-1; for(int i=0;i<Hcnt;i++){ if(x/tmp[i]%3)continue; int mi=-1; if(Hat>Coin&&~dp[x+tmp[i]])Min(mi,dp[x+tmp[i]]); if(~dp[x+2*tmp[i]])Min(mi,dp[x+2*tmp[i]]+(Cnt>0)); if(~mi)Max(res,mi); } if(~res)dp[x]=res;}int main(){ scanf("%d %d %d %d",&n,&m,&k,&num); for(int i=0;i<n;i++){ scanf("%s",str); for(int j=0;j<m;j++) if(str[j]=='H'){ Q[Hcnt++]=(node){i,j}; cntx[i]++;cnty[j]++; } } for(int i=1;i<=k;i++)scanf("%d",&val[i]); tmp[0]=1; for(int i=1;i<=Hcnt;i++)tmp[i]=tmp[i-1]*3; memset(dp,-1,sizeof(dp)); for(int i=tmp[Hcnt]-1;i>=0;i--)solve(i); if(dp[0]==-1)puts("-1"); else { int res=0; sort(val+1,val+k+1); for(int i=1;i<=dp[0];i++)res+=val[i]; printf("%d\n",res); } return 0;}
阅读全文
1 0
- SRM549 Div1Medium MagicalHats
- SRM549
- SRM549
- SRM549 Div1 600
- [状压DP] TopCoderSRM549 DIV1 600. MagicalHats
- SRM548 Div1Medium KingdomAndDice
- SRM551 Div1Medium ColorfulWolves
- SRM573 Div1Medium Ski Resorts
- SRM574 Div1Medium PolygonTraversal
- SRM579 Div1Medium TravellingPurchasingMan
- SRM588 Div1Medium KeyDungeonDiv1
- SRM589 Div1Medium GearsDiv1
- SRM554 Div1Medium TheBrickTowerMediumDivOne
- SRM548 Div1Medium KingdomAndDice
- SRM551 Div1Medium ColorfulWolves
- SRM593 Div1Medium MayTheBestPetWin
- SRM573 Div1Medium Ski Resorts
- SRM579 Div1Medium TravellingPurchasingMan
- JavaScript
- new与malloc的区别(1)
- 选择排序(选择排序和堆排序)
- 面向对象编程之static关键字
- C,C++,C#三者区别
- SRM549 Div1Medium MagicalHats
- wind IDE的中文输入问题
- Java之三大集合框架
- 与eclipse集成的管理zookeeper工具zookeeperBrowser
- linux 下 dd命令用法
- Linux下的常用替换命令
- Java并发之神修炼之路---创建多线程的三种方式
- Android常用系统广播
- Java中那些不得不说的坑