hdu_5890_Eighty seven(bitset优化DP)
2016-09-23 23:58
399 查看
题意:
50个数,10W个询问,每次问删掉第i,j,k个数后,是否存在一种选10个数和为87的方案,只需要输出 ’Yes’ 或者 ’No’
题解:
暴力:不同的询问大概2W个,每个暴力bitset DP,抠一抠能卡着过。优化1:先求出一组解,如果询问和解没交就是’Yes’,否则暴力,不同的询问大概1W个;优化2:先预处理出所有询问的答案,能方便的复用之前的DP数组,不用每次从头开始重新求。
以上是camp的题解
这里学习了一下bitset,把87*n优化到了10*n,然后可以卡过去
dp[i][j]表示选了i个数和为j的情况,dp[j]|=dp[j-1]<<a[i],j从10到1,这样就能优美的记录和的情况
#include<bits/stdc++.h> #define F(i,a,b) for(int i=a;i<=b;i++) using namespace std; bitset<90>dp[11]; int ans[55][55][55],a[55],n,m,q[4],T; bool check(int x,int y,int z) { F(i,0,10)dp[i].reset(); dp[0][0]=1; F(i,1,n)if(i!=x&&i!=y&&i!=z)for(int j=10;j>0;j--)dp[j]|=dp[j-1]<<a[i]; return dp[10][87]; } int main() { scanf("%d",&T); while(T--) { memset(ans,0,sizeof(ans)); scanf("%d",&n); F(i,1,n)scanf("%d",a+i); F(i,1,n)F(j,i,n)F(k,j,n)if(check(i,j,k))ans[i][j][k]=1; scanf("%d",&m); while(m--) { F(i,0,2)scanf("%d",q+i); sort(q,q+3); if(ans[q[0]][q[1]][q[2]])puts("Yes");else puts("No"); } } return 0; }View Code
相关文章推荐
- HDU 5890 Eighty seven(bitset优化dp)
- hdu 5890 Eighty seven 暴力+bitset优化背包
- hdu 5890 Eighty seven(背包+bitset)
- hdu 5890 Eighty seven 背包bitset
- hdu 5890 01背包(bitset优化)
- HDU 5890 Eighty seven ACM/ICPC 2015 Shenyang Online(DP+bitset优化)
- HDU 5745 La Vie en rose bitset优化dp
- [HDOJ5890]Eighty seven(暴力,dp,bitset)
- HDU 5745 La Vie en rose(bitset优化dp)
- HDU 5745 dp, bitset优化
- dp+bitset优化______La Vie en rose( hdu 5745 2016多校第二场)
- 2015 Multi-University Training Contest 10 (hdu 5406-5416)数据结构+dp+矩阵快速幂+bitset优化拓扑排序+(dp&树状数组)
- HDU 3480 Division(斜率优化DP)
- HDU 2993 MAX Average Problem(斜率优化DP)
- hdu 4258(斜率优化DP)
- hdu 4374 One hundred layer 单调队列优化dp
- HDU 2829 Lawrence(斜率优化DP)
- HDU 3507 Print Article【斜率优化dp】
- HDU 3507 Print Article(斜率DP优化)
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]