HDU 5800 To My Girlfriend(单调DP)
【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=5800
【题目大意】
给出一个容量上限s,f[i][j][k][l][m]表示k和l两个物品不能选,i和j两个物品必选,最终质量为m的方案数。求这些方案数的总和。
【题解】
令dp[i][j][s1][s2]表示前i个物品填了j的体积,有s1个物品选为为必选,s2个物品选为必不选的方案数(0<=s1,s2<=2),则有转移方程dp[i][j][s1][s2]=dp[i-1][j][s1][s2]+dp[i-1][j-a[i]][s1-1][s2]+dp[i-1][j][s1][s2-1],边界条件为dp[0][0][0][0]=1,时间复杂度O(NS*3^2)。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
typedef long long LL;
const int N=1005;
const LL mod=1e9+7;
int a[N],n,s,t,T;
LL dp[2][N][3][3],ans;
void add(LL &a,LL b){a=a+b;if(a>mod)a-=mod;}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&s);
rep(i,n)scanf("%d",a+i);
memset(dp,t=0,sizeof(dp));
dp[0][0][0][0]=1;ans=0;
rep(i,n){
t^=1;
for(int j=s;j>=0;j--){
for(int u=0;u<3;u++)for(int v=0;v<3;v++){
dp[t][j][u][v]=dp[t^1][j][u][v];
if(j>=a[i])add(dp[t][j][u][v],dp[t^1][j-a[i]][u][v]);
if(u&&j>=a[i])add(dp[t][j][u][v],dp[t^1][j-a[i]][u-1][v]);
if(v)add(dp[t][j][u][v],dp[t^1][j][u][v-1]);
}
}
}rep(i,s)add(ans,dp[t][i][2][2]);
ans=((ans*2)%mod)*2%mod;
printf("%lld\n",ans);
}return 0;
}
HDU 5800 To My Girlfriend(单调DP)的更多相关文章
- hdu 5800 To My Girlfriend + dp
传送门:hdu 5800 To My Girlfriend 题意:给定n个物品,其中i,j必选,l,m必不选,问组成体积为s的方法一共有多少种 思路:定义dp[i][j][s1][s2],表示前i种物 ...
- HDU 5800 To My Girlfriend 背包
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5800 To My Girlfriend Time Limit: 2000/2000 MS (Java ...
- hdu 5800 To My Girlfriend(背包变形)
To My Girlfriend Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5800 To My Girlfriend
背包变形.dp[i][j][g][h]表示前i个数字,和为j,有g个必选,有h个必不选的方案数. 答案为sum{dp[n][j][2][2]}*4 #pragma comment(linker, &q ...
- HDU 5800 (DP)
Problem To My Girlfriend (HDU 5800) 题目大意 给定一个由n个元素组成的序列,和s (n<=1000,s<=1000) 求 : f (i,j,k,l, ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- HDU 1231 最大连续子序列 --- 入门DP
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
随机推荐
- leetcode Binary Tree Paths python
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...
- 纯CSS 贴底部的布局(兼容各个浏览器包括IE6)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- Centos for php+mysql+apache
一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...
- Windows下载安装jmeter
一.下载 jmeter下载地址: http://jmeter.apache.org/download_jmeter.cgi Binaries-apache-jmeter-3.0.zip 二.安装 1. ...
- spring4之依赖注入的三种方式
1.Setter注入 <bean id="helloWorld" class="com.jdw.spring.beans.HelloWorld"> ...
- MVC自学第一课
了解传统的ASP.NET WebForm ASP.NET 在02年问世,给Web开发领域带来了巨大转变.下图描述了当时微软的技术堆栈. ASP.NET WebForm 技术堆栈 (注:此图的含义为,W ...
- “Options模式”下各种类型的Options对象是如何绑定的?
“Options模式”下各种类型的Options对象是如何绑定的? 旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基 ...
- office软件卸载
因为工具是微软出的,并且对应的是每一个版本,所以这里我给大家说下每个版本的对应卸载工具,和卸载方法. office2013卸载 下载对应卸载工具,安装工具,比如你的是2013版本的office,那么下 ...
- Oracle EBS-SQL (SYS-8):职责定义明细.sql
SELECT DISTINCT fa.application_short_name 模块, b.responsibility_name 职责名称, fa.applica ...
- Xamarin生成的APK大小分析
原文:Xamarin生成的APK大小分析 刚接触Xamarin都会被Xamarin的售价吓一跳,另外就是它生成的APK大小,官方也有相关的说明,这里加上自己的理解同意讲解下: 以下是针对Android ...