HDU-5800-To My Girlfriend-DP
来源:互联网 发布:你怎么看待网络直播 编辑:程序博客网 时间:2024/06/03 19:24
题意:f(i,j,k,l,m)表示必选a[i],a[j]必不选a[k],a[l],加起来总和为m的个数。求1<=i<=n 1<=j<=n 1<=k<=n 1<=l<=n 1<=m<=s (i,j,k,l都不相同的) 的总和
思路:显然是一个DP
设dp[i][j][s1][s2] 为选前i个数字,总和为j,确定必选的s1个,确定必不选的s2个,的个数
显然dp[i][j][s1][s2]=dp[i-1][j][s1][s2]+dp[i-1][j][s1][s2-1]+dp[i-1][j-a[i]][s1-1][s2]+dp[i-1][j-a[i]][s1][s2] (边界处理注意)
dp[0][0][0][0]=1;
由于数组比较大初始化费时间,所以选择滚动数组来压缩空间。
由于i和j k和l可以互换,最后答案要乘4
#include<bits/stdc++.h>#define mod 1000000007using namespace std;int a[1111];long long dp[2][1111][3][3];int main(){ int t; int n,s; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof dp); bool sign=0; dp[0][0][0][0]=1; for(int i=1;i<=n;i++) { sign=!sign; for(int j=s;j>=0;j--) { for(int s1=0;s1<=2;s1++) { for(int s2=0;s2<=2;s2++) { dp[sign][j][s1][s2]=dp[!sign][j][s1][s2]%mod; if(s2>=1) { dp[sign][j][s1][s2]+=dp[!sign][j][s1][s2-1]; dp[sign][j][s1][s2]%=mod; } if(j>=a[i]) { dp[sign][j][s1][s2]+=dp[!sign][j-a[i]][s1][s2]; dp[sign][j][s1][s2]%=mod; } if(j>=a[i]&&s1>=1) { dp[sign][j][s1][s2]+=dp[!sign][j-a[i]][s1-1][s2]; dp[sign][j][s1][s2]%=mod; } } } } } long long ans=0; for(int i=1;i<=s;i++) { ans+=dp[sign][i][2][2]; ans%=mod; } ans=(((ans*2)%mod)*2)%mod; printf("%lld\n",ans); } return 0;}
0 0
- HDU-5800-To My Girlfriend-DP
- hdu 5800 To My Girlfriend (dp)
- HDU 5800 To My Girlfriend(dp)
- HDU 5800 To My Girlfriend(dp)
- HDU 5800 To My Girlfriend 【DP】
- HDU 5800 To My Girlfriend 【DP】
- HDU 5800 To My Girlfriend(DP)
- HDU 5800 To My Girlfriend
- hdu 5800 To My Girlfriend
- [HDU 5800] To My Girlfriend (计数DP)
- HDU 5800 - To My Girlfriend-四维DP
- HDU 5800 To My Girlfriend(计数DP)
- 【hdu 5800】To My Girlfriend dp+乱搞+总结
- To My Girlfriend HDU
- 【HDOJ 5800】To My Girlfriend(DP)
- Problem To My Girlfriend (HDU 5800)
- HDU 5800 To My Girlfriend (动态规划)
- HDU 5800 To My Girlfriend【动态规划】
- 求两个有序数组两两相加的值最小的K个数
- 153.The database instance has the following parameter setting: OS_AUTHENT_PREFIX = OPS$ OS_ROLES = F
- Android Path Time ScrollBar(Path 时间轴)
- C++调用空指针对象的成员函数——静态绑定与动态绑定
- JavaScript飞机大战
- HDU-5800-To My Girlfriend-DP
- LightOJ_1106 Gone Fishing
- LightOJ 1037 Agent 47(状压DP)
- 设计模式原则和分类总结
- 依赖关系的解决:程序包管理器的前段工具yum
- 深入 Java 调试体系,第 3 部分: JDWP 协议及实现
- java synchronized关键字用法
- leetcode 329. Longest Increasing Path in a Matrix 解题报告
- Educational Codeforces Round 15 E. Analysis of Pathes in Functio(每个点走k步会到达哪个点,经过的边中的最小值是多少,经过的边的权值和)