hdu5800 To My Girlfriend dp 需要比较扎实的dp基础。
To My Girlfriend
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1288 Accepted Submission(s): 492
I
never forget the moment I met with you.You carefully asked me: "I have a
very difficult problem. Can you teach me?".I replied with a smile, "of
course"."I have n items, their weight was a[i]",you said,"Let's define
f(i,j,k,l,m) to be the number of the subset of the weight of n items was
m in total and has No.i and No.j items without No.k and No.l
items.""And then," I asked.You said:"I want to know
Sincerely yours,
Liao
Each case contains 2 integers n, s (4≤n≤1000,1≤s≤1000). The next line contains n numbers: a1,a2,…,an (1≤ai≤1000).
4 4
1 2 3 4
4 4
1 2 3 4
8
/**
题目:To My Girlfriend
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5800
题意:如原题公式所示。
思路: 来源出题方给的题解。 令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][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)。 dp[i - 1][j][s1][s2]: 不选第i个
dp[i-1][j-a[i]][s1][s2]: 选第i个
dp[i - 1][j - a[i]][s1 - 1][s2]: 第i个必选
dp[i - 1][j][s1][s2 - 1]: 第i个必不选 最终结果为ans += dp[n][x][2][2]*4;(1<=x<=s)
因为:
dp[n][x][2][2]算出来的都是没有排列时候选的i,j,k,l;
经过排列即:(i,j),(j,i),(k,l),(l,k)共四种。所有*4;
*/ #include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=1e9+;
const int maxn=1e6+;
const double eps = 1e-;
int dp[][][][];
int a[];
int n, s;
int main()
{
int T;
cin>>T;
while(T--)
{
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++){
dp[i][j][s1][s2] = dp[i-][j][s1][s2];
if(s1!=&&j>=a[i]){
dp[i][j][s1][s2] += dp[i-][j-a[i]][s1-][s2];
dp[i][j][s1][s2] %= mod;
}
if(j>=a[i]){
dp[i][j][s1][s2] += dp[i-][j-a[i]][s1][s2];
dp[i][j][s1][s2] %= mod;
}
if(s2!=){
dp[i][j][s1][s2] += dp[i-][j][s1][s2-];
dp[i][j][s1][s2] %= mod;
}
}
}
}
}
LL ans = ;
for(int i = ; i <= s; i++) {
ans = (ans+dp[n][i][][])%mod;
}
printf("%lld\n",ans*%mod);
}
return ;
}
hdu5800 To My Girlfriend dp 需要比较扎实的dp基础。的更多相关文章
- HDU5800 To My Girlfriend 背包计数dp
分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...
- 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...
- 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,“招人啦.” 然某群友曰,“群主,俺想去.” LZ回之,“你年几何?” 群友曰,“两年也.” LZ憾言之,“惜 ...
- dp乱写2:论dp在不在dp中(但在dp范畴)内的应用
最近正儿八经的学习了dp,有一些题目非常明显看出来就是dp了比如说:过河卒.方格取数.导弹拦截.加分二叉树.炮兵阵地更加明显的还有:采药.装箱问题.过河.金明的预算方案.今天来谈谈dp的dp在不在dp ...
- [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...
- 程序人生:01如何做到招聘要求中的“要有扎实的Java基础”
本文摘自左潇龙博客,原文出处:http://www.zuoxiaolong.com/html/article_232.html 来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日 ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- POJ2411Mondriaan's Dream(DP+状态压缩 or 插头DP)
问题: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...
- <DP> (高频)139 375 374 (DP hard)312
139. Word Break 返回结果较为简单可用dp, 复杂用dfs class Solution { public boolean wordBreak(String s, List<Str ...
随机推荐
- iOS计算富文本(NSMutableAttributedString)高度
有时候开发中我们为了样式好看, 需要对文本设置富文本属性, 设置完后那么怎样计算其高度呢, 很简单, 方法如下: - (NSInteger)hideLabelLayoutHeight:(NSStrin ...
- 学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础--第4章
第4章 子查询 4.2.1 Exist 谓语: use TSQLFundamentals2008 select * from Sales.Customers as C where c.country= ...
- C++之string学习
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> #include <string& ...
- Java集合迭代器 Iterator分析
简介 迭代器是遍历容器的一种常用方法,它屏蔽了容器的实现细节,无需暴露数据结构内部,就可以对容器进行遍历,迭代器本身也是一种设计模式,迭代是一种特殊的遍历方式. Iterator 在java中,迭代器 ...
- 最简单的PHP socket
服务端 <?phperror_reporting(E_ALL);set_time_limit(0); $ip = "127.0.0.1";$port = 1935; func ...
- Redis 命令一
Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 1.Redis 客户 ...
- [Python爬虫] 之二十三:Selenium +phantomjs 利用 pyquery抓取智能电视网数据
一.介绍 本例子用Selenium +phantomjs爬取智能电视网(http://news.znds.com/article/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字 ...
- 使用JavaScript和Canvas实现下雪动画效果
该下雪动画效果使用了HTML5中Canvas画布实现,其中涉及了物理学中曲线运动的相关知识与运算. index.html <!DOCTYPE html> <html lang=&qu ...
- LDAP简介及LDAP服务器的安装与配置
一.LDAP简介 全称:Lightweight Directory Access Protocol,目录服务是一种特殊的数据库系统,其专门针对读取. LDAP目录中的信息是按照树型结构组织,具体信息存 ...
- lua与c++ 中布尔布bool值对应关系
lua代码返回值为真c++ lua_toboolean 返回一个 int lua true = 1 false = 0 c++给lua返回 lua_pushboolean 1 = true 0 = ...