ACM-ICPC(9/26)
DP专题
多阶段决策:递推——逆推方式(难度较大),记忆化搜索方式,考虑当前决策层(cur)
01背包:变形众多,两种方式,一是考虑阶段的方式, ,另一种是刷表法
题目推荐:
bzoj 4247
Description
JOI君有N个装在手机上的挂饰,编号为1...N。 JOI君可以将其中的一些装在手机上。
JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件的挂钩。每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上。直接挂在手机上的挂件最多有1个。
此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示。如果JOI君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数。
JOI君想要最大化所有挂饰的喜悦值之和。注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的。
Input
第一行一个整数N,代表挂饰的个数。
接下来N行,第i行(1<=i<=N)有两个空格分隔的整数Ai和Bi,表示挂饰i有Ai个挂钩,安装后会获得Bi的喜悦值。
Output
输出一行一个整数,表示手机上连接的挂饰总和的最大值
Sample Input
50 42 -21 -10 10 3
Sample Output
5
HINT
将挂饰2直接挂在手机上,然后将挂饰1和挂饰5分别挂在挂饰2的两个挂钩上,可以获得最大喜悦值4-2+3=5。
1<=N<=2000
0<=Ai<=N(1<=i<=N)
-106<=Bi<=106(1<=i<=N)
分析:单纯考虑第一个挂饰,决策的顺序有很大的影响,这样会陷入暴力的方案中去,按照挂钩排序,这样就貌似不用考虑是否没有地方放了。考虑前 i 个物品, 是否能转移呢? 加一维 j 当前有多少挂钩,
保证 j >=1 ,初始化状态 其他 负很多,这样才能将开始就是负数的状态转移上来。
可以发现,这个过程其实就是一个01背包刷表过程。
/**************************************************************
Problem: 4247
User: TreeDream
Language: C++
Result: Accepted
Time:2180 ms
Memory:17012 kb
****************************************************************/ #include <bits/stdc++.h> using namespace std; const int inf =0x3f3f3f3f; int n;
struct Node {
int a,b;
bool operator < (const Node& rhs) const {
return a > rhs.a;
}
}nodes[2005]; int dp[2005][2005]; int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n); for(int i = 1; i <=n; i++)
scanf("%d%d",&nodes[i].a,&nodes[i].b);
sort(nodes+1,nodes+1+n);
for(int i = 0; i <=n; i++)
memset(dp[i],-inf,sizeof(dp[i]));
dp[0][1] = 0;
for(int i=1;i<=n;i++) {
for(int j=n;j>=0;j--) {
int tmp = max(j-nodes[i].a,0);
dp[i][j] = max(dp[i-1][j],dp[i-1][tmp+1]+nodes[i].b);
}
} int ans = 0;
for(int i = 0; i <= n; i++)
ans = max(ans,dp[n][i]);
printf("%d\n",ans); return 0;
}
其实还有一些题目要推荐的:今天上课太热了,脑子有点晕,明天更新这一块的有趣的内容。
ACM-ICPC(9/26)的更多相关文章
- 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)
长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到.例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等. 在这些表示法中,字典序最小 ...
- 欢迎来怼——第14次Scrum会议(10/26)
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/26 17:00~17:13(总计13min).地点:计 ...
- Linux常用命令(6/26)——dd命令和split命令
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 以可选块长度复制文件,默认情况下从标准输入设备输出到标准输出设备.复制过程中,还可以对文件进行一些转换. dd命令可以指定block的 ...
- ADO.NET知识的运用一(Day 26)
哈哈,又到了总结的时间了,来回顾一下今天主要学了关于ADO.NET的哪些知识吧.(这次学的ADO访问数据库主要以访问SQL数据库为主) 理论: 首先我们要知道为什么要学习ADO.NET? 因为我们之 ...
- 《从零开始学Swift》学习笔记(Day 26)——可选链
原创文章,欢迎转载.转载请注明:关东升的博客 在Swift程序表达式中会看到问号(?)和感叹号(!),它们代表什么含义呢?这些符号都与可选类型和可选链相关,下面来看看可选链. 可选链: 类图: 它们之 ...
- 弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)
I think: 给出k(4≤k≤5000)个互不相同的整数组成的序列Ni,判断是否存在4个整数Np.Nq.Nr和Ns(1≤p<q<r<s≤k),使得Nq>Ns>Np&g ...
- 2017 ACM/ICPC(西安)赛后总结
早上8:00的高铁,所以不得不6点前起床,向火车站赶……到达西安后已经是中午,西工大距离西安北站大概3小时车程的距离,只好先解决午饭再赶路了……下午3.30的热身赛,一行人在3.35左右赶到了赛场,坐 ...
- 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)
如果x加上x的各个数字之和得到y,就说x是y的生成元.给出n(1≤n≤100000),求最小 生成元.无解输出0.例如,n=216,121,2005时的解分别为198,0,1979. [分析] 本题看 ...
- 数数字(Digit Counting,ACM/ICPC Danang 2007,UVa1225)
#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[10000]; in ...
- 习题3-3 数数字(Digit Counting , ACM/ICPC Danang 2007, UVa1225)
#include<stdio.h> #include<string.h> int main() { char s[100]; scanf("%s",s); ...
随机推荐
- Knime 连接 MYSQL 8
mysql8 腾空出世,话说mysql 跨过 6 7 版本直迈8,对这个数据库有跨时代的意思,引擎机制有个革命性的变革.决定尝试一把. 用大数据ETL工具Knime抽取数据.结果尴尬了: ERROR ...
- postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改
如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...
- rsync 问题总结
Rsync服务常见问题汇总讲解:==================================1. rsync服务端开启的iptables防火墙 [客户端的错误] No route to ...
- Android 中判断网络状态
首先在AndroidManifest.xml添加权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_ ...
- 基于前端js模板替换的多语言方案思考
最近在做将一个系统多语言化的项目,系统使用的是ASP.NET,直接使用了一种已有的方案:在页面渲染时采用正则表达式替换{XXX:001 确定}格式的标记.但是这个方式增加了服务端的字符串处理,对页面性 ...
- hibernate框架的搭建
1 导入所需的jar包 1 导入hibernate必须的jar包 2 导入驱动包 2 创建数据库,准备表,实体 1 创建hibernate数据库 CREATE DATABASE hibernate; ...
- linux_api之进程环境
本篇索引: 1.引言 2.main函数 3.进程的终止方式 4.exit和_exit函数 5.atexit函数 7.环境表 8.C程序程序空间布局 9.存储空间的手动分配 10.库文件 1.引言 一个 ...
- TCP-Java--图谱
- 线程中断方法interrupt() 与 cancel()
(一).关于interrupt() interrupt()并不直接中断线程,而是设定一个中断标识,然后由程序进行中断检查,确定是否中断. 1. sleep() & interr ...
- View视图调用控制器方法
1.@using XXX.Controllers;//引用控制器 2. var otherController = DependencyResolver.Current.GetService<U ...