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)的更多相关文章

  1. hdu 5534(dp)

    Input The first line contains an integer T indicating the total number of test cases. Each test case ...

  2. hdu 5464(dp)

    题意: 给你n个数,要求选一些数(可以不选),把它们加起来,使得和恰好是p的倍数(0也是p的倍数),求方案数. - - 心好痛,又没想到动规 #include <stdio.h> #inc ...

  3. HDU 2571(dp)题解

    命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. Find a path HDU - 5492 (dp)

    Find a path Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. 饭卡 HDU - 2546(dp)

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...

  6. HDU 4489(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4489 解题思路这里已经说的很清楚了: http://blog.csdn.net/bossup/article/d ...

  7. hdu 1024(dp)

    传送门:Max Sum Plus Plus 题意:从n个数中选出m段不相交的连续子段,求这个和最大. 分析:经典dp,dp[i][j][0]表示不取第i个数且前i个数分成j段达到的最优值,dp[i][ ...

  8. AreYouBusy HDU - 3535 (dp)

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU 2577(DP)

    题意:要求一个字符串输入,按键盘的最少次数.有Caps Lock和Shift两种转换大小写输入的方式 思路:用dpa与dpb数组分别记录Caps Lock的开关状态,dpa表示不开,dpb表示开 代码 ...

随机推荐

  1. BZOJ1029: [JSOI2007]建筑抢修(贪心)

    题目链接:BZOJ1029: [JSOI2007]建筑抢修 题解:贪心思想,按结束时间从小到大排序,选花费时间尽量短的建筑维修,用堆维护. #include<stdio.h> #inclu ...

  2. 镜像渐变-radio-gradient

    2013年11月15日13:08:37   <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"&g ...

  3. CPU厂商

    1·Intel公司 Intel是生产CPU的老大哥,它占有大约80%的市场份额,Intel生产的CPU就成了事实上的x86CPU技术规范和标准.最新的酷睿2成为CPU的首选. 2·AMD公司 除了In ...

  4. Oracle存储过程写法

    create or replace procedure QIANFEIGL_JIAOKUANDY( cebenh varchar2, kehuh varchar2, hetongh varchar2, ...

  5. CentOS 6.2下SVN服务器的安装与配置

    安装了一下SVN服务器,本文没有与Apache整合,过程如下: 一,下载相关软件: [root@youxia201 test]# wget http://subversion.tigris.org/d ...

  6. Jquery select 选中项中自定义的值

    给select 赋值,除了已有的value及text,新建一属性simple_name function GetDicOfficeList(dicType, sid) { $.ajax({ url: ...

  7. HtmlHelper—DropDownList:SelectList、SelectListItem

    前言 在项目中经常使用到DropDownList来显示数据库中的数据,典型的例子为为某书籍选择所属类型. 使用SelectList来实现: 实现一: Controller 代码 SelectList ...

  8. python使用urllib2抓取网页

    1.使用python的库urllib2,用到urlopen和Request方法. 2.方法urlopen原形 urllib2.urlopen(url[, data][, timeout]) 其中: u ...

  9. Junit4的简单使用

    junit4的简单使用 测试套件的使用 测试类1 package com.westward; import static org.junit.Assert.*; import org.junit.Te ...

  10. elasticsearch插件之一:kibana

    介绍: 要说kibana,就不得不先说一下logstash.这里呢,先要讲个故事.故事是开头是这样的,Logstash早期曾经自带了一个特别简单的logstash-web用来查看ES中的数据,其功能太 ...