HDU 5800 (DP)
Problem To My Girlfriend (HDU 5800)
题目大意
给定一个由n个元素组成的序列,和s (n<=1000,s<=1000)
求 :

f (i,j,k,l,m) 指必定选第i,j号元素,必定不选k,l号元素,选的元素总和为m的子集个数。
解题分析
一开始想了个n^3的DP,f[j][k]表示选j个数总和为k的方案数,然后一直想着怎么去优化,陷进死胡同,到比赛结束还没想出来。
看了题解后,感觉智商被藐视了。
题解的做法是f[i][j][s1][s2]表示前i个数总和为j必选s1个必不选s2个的方案数,这样是O(n*s*9)的。
对于每一个数,有4种选法:选,不选,必选,必不选,然后转移就好了。
答案就是sigma(f[n][i][2][2]) ,i∈[0,s]。
参考程序
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; #define N 1008
#define mo 1000000007 int dp[N][N][][];
int a[N]; void add(int &x,int y){
x = x + y;
if (x >= mo) x -= mo;
}
int main(){
int T;
scanf("%d",&T);
while (T--){
int n,s;
scanf("%d%d",&n,&s);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
memset(dp,,sizeof(dp));
dp[][][][]=;
for (int i=;i<=n;i++)
for (int j=;j<=s;j++)
for (int s1=;s1<=;s1++)
for (int s2=;s2<=;s2++){
add(dp[i][j][s1][s2],dp[i-][j][s1][s2]);
if (j>=a[i]) add(dp[i][j][s1][s2],dp[i-][j-a[i]][s1][s2]);
if (s1> && j>=a[i])
add(dp[i][j][s1][s2],dp[i-][j-a[i]][s1-][s2]);
if (s2>)
add(dp[i][j][s1][s2],dp[i-][j][s1][s2-]);
}
int ans=;
for (int i=;i<=s;i++) add(ans,dp[n][i][][]);
printf("%I64d\n",ans*4ll % mo);
}
}
HDU 5800 (DP)的更多相关文章
- hdu 5534(dp)
Input The first line contains an integer T indicating the total number of test cases. Each test case ...
- hdu 5464(dp)
题意: 给你n个数,要求选一些数(可以不选),把它们加起来,使得和恰好是p的倍数(0也是p的倍数),求方案数. - - 心好痛,又没想到动规 #include <stdio.h> #inc ...
- HDU 2571(dp)题解
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- Find a path HDU - 5492 (dp)
Find a path Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 饭卡 HDU - 2546(dp)
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...
- HDU 4489(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4489 解题思路这里已经说的很清楚了: http://blog.csdn.net/bossup/article/d ...
- hdu 1024(dp)
传送门:Max Sum Plus Plus 题意:从n个数中选出m段不相交的连续子段,求这个和最大. 分析:经典dp,dp[i][j][0]表示不取第i个数且前i个数分成j段达到的最优值,dp[i][ ...
- AreYouBusy HDU - 3535 (dp)
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2577(DP)
题意:要求一个字符串输入,按键盘的最少次数.有Caps Lock和Shift两种转换大小写输入的方式 思路:用dpa与dpb数组分别记录Caps Lock的开关状态,dpa表示不开,dpb表示开 代码 ...
随机推荐
- iOS开发之——从零开始完成页面切换形变动画
前言 某天我接到了UI发给我的两张图: 需求图.png 看到图的时候我一脸懵逼,显然我需要做一个页面切换的指示动画.老实说,从大三暑假开始做iOS开发也一年有余了,但是遇到复杂动画总是唯恐避之不及,只 ...
- OC 实例方法和类方法区别
Objective-C里面既有实例方法也类方法.类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method).工 ...
- C语言链表
#include<stdio.h>#include<malloc.h>#include<stdlib.h> typedef struct Node{ int dat ...
- Java script基础
Java script基础 Js的每个语句后面都要有分号. <script type="text/java script">所有JS内容</script> ...
- 使用cnblogs.com的用户体验和提出来的建议
1.是否提供良好的体验给用户(同时提供价值)? 我是很久以前就有CN的账号了的,因为这个网站有很多有用的信息,和比较活跃的论坛.很多不懂的问题可以求助上面的大神.但是,我第一次登陆主页面的时候我是懵逼 ...
- JDE函数--GetUDC(B函数)
GetUDC使用方式:
- ASP.NET Web API路由规
默认的规则 在ASP.NET MVC4中 global.asax.cs代码中并无注册默认路由规则的代码 代码如下: public class WebApiApplication : System.We ...
- 在ASP.NET MVC中使用Area
前言: 这段时间小猪花了不少功夫在研究ASP.NET MVC的源码上面,可谓思想是了解了不少,用的上用不上却是另外一回事了.! 应用场景: ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规 ...
- bzoj 2243: [SDOI2011]染色
#include<cstdio> #include<iostream> #define M 1000006 #define N 1000006 using namespace ...
- Excel公式中双引号和单引号输入和显示以及函数的选择确认
[Excel中显示双引号] 1.直接输入双引号“”或单引号“ 2.工式中显示双引号需输入“”“”“”(六个引号)或单引号需输入“”“”(四个引号) [Excel中快速确认已选择的函数] 1.用键盘的上 ...