设为首页 加入收藏

TOP

HDU--5119Happy Matt Friends+dp
2015-11-21 01:04:11 来源: 作者: 【 】 浏览:2
Tags:HDU--5119Happy Matt Friends

其实还是穷举子集类的dp,一般这种dp我们只需要用一个一维的滚动数组就可以了,但是这个题目状态转移的时候不但可能向后还有可能向前,所以这次得用二维数组.
状态方程 dp[i][j]=dp[i-1][j]+dp[i-1][j^num[i]],分别表示第i个数不取和第i个数取情况下状态.

代码如下:

#include
   
     #include
    
      #include
     
       using namespace std; #define maxn 2100000 ///太小就会WA int dp[50][maxn]; int num[50]; int main() { int t,Case=0; scanf("%d",&t); while(t--) { int n,m; memset(dp,0,sizeof(dp)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&num[i]); int Max=(1<<20); dp[0][0]=1; ///利用j^num[i]^num[i]=j进行状态转移 ///即dp[i-1][j]是由dp[i-1][j^num[i]]再^num[i]得到的 ///dp[i][j]=dp[i-1][j]+dp[i-1][j^num[i]] for(int i=1;i<=n;i++) { for(int j=0;j<=Max;j++) dp[i][j]=dp[i-1][j]+dp[i-1][j^num[i]]; } long long sum=0; for(int i=m;i<=Max;i++) sum+=dp[n][i]; printf("Case #%d: %lld\n",++Case,sum); } return 0; } 
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1050 动态规划 下一篇poj 3009 Curling 2.0 (BFS)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: