博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1036 dp
阅读量:2239 次
发布时间:2019-05-09

本文共 1341 字,大约阅读时间需要 4 分钟。

题意:N个歹徒去一个餐馆,餐馆门有k个打开程度(每个打开程度为门的一个状态),每个歹徒拥有各自的肥胖度和繁荣度(prosperity),歹徒在i 时刻到达餐馆,若此时刻门的打开程度与歹徒的肥胖度完全相同,则歹徒就进入餐馆,同时餐馆获得这个歹徒相应的繁荣度,若歹徒到来时门的打开程度与歹徒的肥胖程度不同,则歹徒离开且不再回来。门的打开程度在每个单位时间里可以加1、减1或不变。

要求:通过控制门的打开程度,使餐馆最后获得最大的繁荣度,最初门的打开程度为0。 
算法:dp
先按到达餐馆的时刻对歹徒进行升序排序 
设dp[i]为前i个歹徒到达餐馆时餐馆获得的最大繁荣度
dp[i] =  max{dp[j]+pi}  1 <= j < i

#include 
#include
#include
using namespace std;int N,K,T;int dp[101]; // dp[t][k]=j: t时刻门的状态为k时所获得的最大繁荣度是jstruct GANGSTER{ int t; int p; int s;};GANGSTER gangsters[101];bool cmp(const GANGSTER &a, const GANGSTER &b){ return a.t < b.t;}int main(){ while (cin >> N >> K >> T) { memset(dp,0,sizeof(dp)); for (int i=1; i<=N; i++) { cin >> gangsters[i].t; } for (int i=1; i<=N; i++) { cin >> gangsters[i].p; } for (int i=1; i<=N; i++) { cin >> gangsters[i].s; } sort(gangsters,gangsters+N+1,cmp); // 此处是gangsters+N+1,不是gangsters+N,WA数次!!! int ans = 0; // 依次处理前i个gangster for (int i=1; i<=N; i++) { if (gangsters[i].t > T) { break; } if (gangsters[i].s > gangsters[i].t) { continue; } for (int j=0; j
= abs(gangsters[i].s-gangsters[j].s)) { // dp[i]=max{dp[j]+pi} if (dp[i] < dp[j] + gangsters[i].p) { dp[i] = dp[j] + gangsters[i].p; } } if (dp[i] > ans) { ans = dp[i]; } } } cout << ans << endl; }}

转载地址:http://trlbb.baihongyu.com/

你可能感兴趣的文章
微信小程序-调用-腾讯视频-解决方案
查看>>
phpStudy安装yaf扩展
查看>>
密码 加密 加盐 常用操作记录
查看>>
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
日本語の記号の読み方
查看>>