POJ1015 动态规划
问题重述:
在n个候选者中选取m个人进入陪审团。每个候选者获得两项评分:D[j],P[j]。求解最佳评审团,使得在每个成员的两项评分和之差 最小的情况下,使得两项评分和之和 最大。
分析:
欲采用动态规划求解,必须先找到最优子结构。假如考虑评分差的绝对值,它的子问题并不一定是最优解。若考虑一定评分差下的评分和最大值,则拥有最优子结构。
用dp[i][j]表示在第i个评委评分后,评分差是j的最大评分和,得到递归公式:
dp[i][j] = max{ dp[ i - 1 ][ j - (D[i] - P[j]) ] + D[i] + P[j], dp[ i - 1 ][j] }
AC代码
//Memory: 380K Time: 79MS
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
][];
][];
int n, m;
], d[];
;
];
bool findPath(int n, int s, int target)
{
) return false;
if (target == prior[n][s + offset]) return true;
int p = prior[n][s + offset];
, s - (d[p] - q[p]), target);
}
void output(int ans)
{
; j--) {
r[j - ] = prior[j][ans + offset];
int p = prior[j][ans + offset];
ans -= (d[p] - q[p]);
}
sort(r, r + m);
; i < m; i++)
cout << " " << r[i];
cout << endl << endl;
}
int main()
{
;
while ( cin >> n >> m && n ) {
; i <= n; i++)
cin >> d[i] >> q[i];
memset(dp, -, sizeof(dp));
memset(prior, , sizeof(prior));
dp[][offset] = ;
; i <= m; i++) {
; j <= n; j++) {
int ss = d[j] + q[j];
int dd = d[j] - q[j];
; s <= ; s++) {
|| s - dd > ) continue;
][s - dd + offset] != - && dp[i - ][s - dd + offset] + ss > dp[i][s + offset] && !findPath(i - , s - dd, j)) {
dp[i][s + offset] = dp[i - ][s - dd + offset] + ss;
prior[i][s + offset] = j;
}
}
}
}
; i <= ; i++) {
&& dp[m][offset - i] == -) continue;
int ans = dp[m][offset + i] > dp[m][offset - i] ? i : -i;
;
;
cout << "Jury #" << cas++ << endl;
cout << "Best jury has value " << sd << " for prosecution and value "
<< sq << " for defence:" << endl;
output(ans);
break;
}
}
;
}
POJ1015 动态规划的更多相关文章
- [POJ1015]Jury Compromise
题目大意:要求你从n个人中选出m个,每个人有两个值p[i],D[i],要求选出的人p总和与D总和的差值最小.若有相同解,则输出p总+D总最大的方案. 动态规划. 一直在想到底是n枚举外面还是m放外面, ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
随机推荐
- 使vim中Syntastic支持C++11
安装好Syntastic后发现不支持c++11,会提示错误incompatible with c++98,解决方法如下: .vimrc中加入: let g:syntastic_cpp_compiler ...
- 批处理更新svn
很多软件都有命令行支持,即可以直接在Windows命令提示符下输入软件提供命令来执行,完成软件的一些功能. 比如输入svn help 可以查看svn支持的命令行 想要更新svn资源需要用到命令svn ...
- syscall 中断号
#ifndef __ASM_ARM_UNISTD_H #define __ASM_ARM_UNISTD_H #define __NR_OABI_SYSCALL_BASE 0x900000 #if de ...
- QT打开网页 QURL
用QT打开一个网页就是先定义一个QUrl对象url,然后利用QDesktopServices::open(url)即可. 例如: const QUrl url(http://www.baidu.com ...
- Chrome下的语音控制框架MyVoix.js使用篇(一)
日前因工作需求,着手研究了语音识别技术,发现github上有网友发布了一款叫做voix.js的javascript框架.在拜读voix.js的源码后发现了不少问题,于是自己写了一款语音识别框架MyVo ...
- 关于API的设计和需求抽象
一,先来谈抽象吧,因为抽象跟后面的API的设计是息息相关的 有句话说的好(不知道谁说的了):计算机科学中的任何问题都可以抽象出一个中间层就解决了. 抽象是指在思维中对同类事物去除其现象的.次要的方面, ...
- spin.js无图片实现loading进度条,支持但非依赖jquery
特点: 1.无图片,无外部CSS 2.无依赖(支持jQuery,但非必须) 3.高度可配置 4.分辨率无关 5.旧版本IE不支持时,采用VML支持 6.使用关键帧动画,采用setTimeout() 7 ...
- 集成Dubbo服务(Spring)
Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...
- 【编程范式】汇编解释swap方法
先要熟悉一些汇编的基本知识: 1.SP是什么? SP是堆栈寄存器,在调用子程序时,都会用到,保存原来程序的环境使用,如各个寄存器的内容,最重要的是,调用返回时程序的运行指令地址,这是由调用时将返回地址 ...
- Direct2D 简介
Direct2D是什么? Direct2D是一套高性能的硬件加速API(代码运行在GPU),用于渲染几何图形,图片和文本,并且可以与Direct3D,GDI,GDI+交互. 什么程序员应该使用Dire ...