hdu(5119)——滚动数组dp
来源:互联网 发布:java程序判断闰年 编辑:程序博客网 时间:2024/06/06 08:54
题意:
现在一个人有n个朋友,它的每个朋友都有一个值,它每次可以选择一些朋友的值然后将它们异或起来,如果最后的异或和大于等于M的话,那么这个人就赢了。
问,这个人有几种赢的方法。
思路:
求有几种方法的题目都可以用dp来思考。dp[i][j]:前i个人异或和为j有几种方法。由于直接开40个人会MLE,所以只能用滚动数组来代替了。
dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j-a[i]]; 这里是用到了类似于背包dp的思想!!
然后就推过去就好了。(但是我不是很会怎么进行优化到一维的?或者说能否优化到一维的呢?。。。
#include<cstdio>#include<cstring>#include<map>#include<set>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<iostream>using namespace std;typedef __int64 ll;typedef unsigned __int64 ULL;#define inf 99999999#define maxn 50#define ps 2097151ll dp[2][ps+10];ll a[maxn];int main(){ int T; scanf("%d",&T); int jj=1; while(T--){ memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%I64d",&a[i]); } dp[0][0]=1; for(int i=1;i<=n;i++){ for(int j=0;j<=ps;j++){ dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j^a[i]]; } } ll num=0; for(int i=m;i<=ps;i++) num+=dp[n%2][i]; printf("Case #%d: %I64d\n",jj++,num); } return 0;}
0 0
- hdu(5119)——滚动数组dp
- HDU 5119 DP 滚动数组,dp求异或
- hdu 1513(dp+滚动数组)
- hdu 1024 dp滚动数组
- HDU 1024(DP+滚动数组)
- 【hdu 1024】Max Sum Plus Plus —— dp && 滚动数组
- DP ( 滚动数组 )——Max Sum Plus Plus ( HDU 1024 )
- hdu 2604 queue #DP#滚动数组
- HDU--1421 -- 搬寝室 [DP] [滚动数组]
- hdu 4576 Robot(dp+滚动数组)
- hdu 4576(概率dp+滚动数组)
- hdu 3392(滚动数组优化dp)
- hdu 4576 概率dp+滚动数组
- hdu 5230 整数划分+dp+滚动数组
- HDU 5389 Zero Escape(DP + 滚动数组)
- DP+滚动数组-HDU-1176-免费馅饼
- HDU 4576(概率DP+滚动数组)
- hdu 4576 D - Robot dp+滚动数组
- Popular Cows-POJ2186Tarjan
- msdn 委托实例
- Windows下检测USB插拔的demo
- Zoho People:人事自动化的5种方式
- Java石头剪刀布小游戏代码
- hdu(5119)——滚动数组dp
- Hdu 1070 MILK
- Texas Instruments
- 前端架构,前端架构组织结构,目录结构架构
- 构建高性能web之路------mysql读写分离实战(转)
- 【BZOJ2738】矩阵乘法【整体二分】
- linux修改一个文件夹下的所有权限
- 虚函数
- 对代理模式的理解