javaee论坛

普通会员

225648

帖子

343

回复

357

积分

楼主
发表于 2019-11-03 07:01:10 | 查看: 587 | 回复: 0

题目链接对dp的几个要素还是理解不透彻!这个dp其实是比较简单的,但是正是因为自己对状态转移理解的问题,做不动。。我们定义dp[i][j]为考虑前i个数时,分数为j的方案数。易得:

dp[0][0]=1;dp[i][j]=dp[i-1][-j]+dp[i-1][j-a[i]];

要注意的是:第一j可以为负,这个我们只要加上一个值就行了。第二数据太大,再加更新位置的不确定,我们必须使用滚动数组。这里我们使用位运算

(0&1)=0;(1&1)=1;从而进行10互换

下面是ac代码:

#include<iostream>#include<cstring>usingnamespacestd;constintMAX=850005;constintmod=1e8+7;intdp[2][MAX];inta[305];intn;intmain(){cin>>n;for(inti=0;i<n;i++)cin>>a[i];dp[1][MAX/2]=1;for(inti=0;i<n;i++){for(intj=-MAX/3;j<MAX/3;j++){if(j==666)continue;dp[i&1][j+MAX/2]=(dp[i&1][j+MAX/2]+dp[!(i&1)][-j+MAX/2]+dp[!(i&1)][j-a[i]+MAX/2])%mod;}memset(dp[!(i&1)],0,sizeof(dp[!(i&1)]));}cout<<dp[(n-1)&1][-666+MAX/2]<<endl;return0;}

上一篇:js推箱子 下一篇:墨水按钮Demo
您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017