POJ1015陪审团(Jury Compromise)——dp+路径记录
题目:http://poj.org/problem?id=1015
差值是有后效性的,所以“转化为可行性”,开一维记录“能否达到这个差值”。
当然可以开两维分别记录 a 和 b,但 “值只是0或1” 和 “当前元素对应一个 a 只有一个 b ,其他 b 就浪费了” 这两点说明这种状态有优化空间。
开一维记录差值,d数组的值记录最大的 a+b 值较好。
虽然差值是绝对值,但需要分正负以计算。可以全部加一个修正值 fix 解决脚标非负的问题。(不要试图开一维0或1记录正负,会在边界的地方分类讨论而死)
然后是重点!!!如何记录路径???
用了LICS记录路径的自己的那个方法:记一个pre,记一个use。但本题中的意义与那题略有不同。自我感觉还不错。虽然慢到了469ms。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int fix=;
int n,m,a[],b[],d[][],pre[][][],ls,xnt,use[][][];
void print(int i,int j,int k,int as,int bs)
{
if(!j)
{
printf("Best jury has value %d for prosecution and value %d for defence:\n",as,bs);
return;
}
print(pre[i][j][k],j-,k-(a[i]-b[i]),as+a[i],bs+b[i]);//pre只存了阶段,j和k还得自己传参
printf("%d ",i);
}
int main()
{
while(++xnt)
{
scanf("%d%d",&n,&m);
if(!n&&!m)return ;
const int lm=*m;
for(int i=;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
memset(d,-,sizeof d);
memset(pre,,sizeof pre);
d[][fix]=;
for(int i=;i<=n;i++)
{
memcpy(use[i],use[i-],sizeof use[i-]);//如果什么都不做,就是沿用着i-1的值(省去的那一维)
memcpy(pre[i],pre[i-],sizeof pre[i-]);//pre记录上一步是哪个阶段
for(int j=m;j;j--) //(对于没有用当前的i的情况,没什么用)
{
int k=a[i]-b[i];
for(int l=-lm+fix;l<=lm+fix;l++)
if(l-k>=-lm+fix&&l-k<=lm+fix&&d[j-][l-k]+a[i]+b[i]>d[j][l])
{
d[j][l]=d[j-][l-k]+a[i]+b[i];
use[i][j][l]=i;//在i这个阶段,达到j和l的是第i号元素
if(use[i-][j-][l-k]==i-) //第几个阶段就是第几号元素。因第i阶段正在考虑第i号元素
pre[i][j][l]=i-;
else pre[i][j][l]=use[i-][j-][l-k];//暨第几阶段
}
} //use和pre的分离只是为了那个判断,能在被用的元素处pre停留一下
} //但他们的意义还是有不同的 for(int i=fix,j=fix;i<=lm+fix&&j>=-lm+fix;i++,j--)
if(d[m][i]>=||d[m][j]>=)
{
if(d[m][i]>=)ls=i;
if(d[m][j]>d[m][i])ls=j;
break;
}
printf("Jury #%d\n",xnt);
if(use[n][m][ls]==n)
{
print(pre[n][m][ls],m-,ls-(a[n]-b[n]),a[n],b[n]);
printf("%d ",n);
}
else print(use[n][m][ls],m,ls,,);//不是pre!!
printf("\n");
}
}
然而有100ms左右的方法,还有各种各样的:http://www.cnblogs.com/Zinn/p/8571061.html
记录路径是一门学问。
POJ1015陪审团(Jury Compromise)——dp+路径记录的更多相关文章
- POJ-1015 Jury Compromise(dp|01背包)
题目: In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting ...
- poj1015陪审团——DP+路径记录
题目:http://poj.org/problem?id=1015 DP的第一维是选了几个人,第二维是当前D与P的差值,而值存的是当前D与P的和: 技巧1:通过平移避免负角标,即代码中的fix: 技巧 ...
- $POJ1015\ Jury\ Compromise\ Dp$/背包
洛谷传送门 $Sol$ 这是一道具有多个“体积维度”的$0/1$背包问题. 把$N$个候选人看做$N$个物品,那么每个物品有如下三种体积: 1.“人数”,每个候选人的“人数”都是$1$,最终要填满容积 ...
- 【poj1015】 Jury Compromise
http://poj.org/problem?id=1015 (题目链接) 题意 随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m 人组成陪审团.选m人的办法是:控方和辩方会根据对候选人的喜欢 ...
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- 【POJ1015】Jury compromise 多个费用的背包
这是一道比较综合的动态规划问题. 首先,根据题目中的从N个人中选出M个人,并且要使得某个目标函数最优,可以想到是背包问题,且因为要取出M个人,人数也应该作为背包体积的一个维度. 其次,要求输出路径,因 ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
- POJ 1015 Jury Compromise dp
大致题意: 从n个候选人中选出m个人作为陪审团.为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与 ...
- POJ1015 && UVA - 323 ~Jury Compromise(dp路径)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
随机推荐
- 网络编程基础——System.Net.Socket 命名空间及相关类的使用
System.Net.Socket 命名空间主要提供制作 Socket 网络应用程序的相关类.(Socket 类.TcpClient 类.TcpListener 类 和 UdpClient 类) 1. ...
- 利用express.js连接mongodb数据库
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = "mongodb://localhost:27017/ ...
- Mysql 中Left/Right join on后面and和where条件查询的差异-Mysql SQL运算符是有优先级
一.Mysql中Left/Right join on后面and和where条件查询的差异 1.建两张测试表,一张商户定义表.一张商户操作状态明细表 1)商户定义表 CREATE TABLE hope. ...
- selenium(二)查找定位目标 ID XPATH CSS 操作目标
简介: 我们只打开一个页面是没有什么意义的. 尽管你可以get很多次. selenium可以做的更多,比如找到百度的搜索框,输入我们要搜索的内容,再用鼠标点击搜索按钮,再把搜索结果提取出来…… 这篇文 ...
- SpingBoot一——demo及阿里云部署
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:https://www.cnblogs.com/by-dream/p/9957624.html 双11买了阿里云的服务器,后续计划 ...
- c#版本与vs的对应关系
版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...
- MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(一)
你开学,我放价!MyEclipse线上狂欢继续!火热开启中>> [MyEclipse最新版下载] MyEclipse支持Java EE技术(如JAX-WS和EJB 3.0),它们以功能包的 ...
- PSP个人软件开发系统面向对象需求分析与设计文档
1.引言 1.1编写的目的 编写该文档的目的是,对产品进行定义,详尽说明该产品的软件需求,简述我们对 PSP个人软件开发系统的初步设想,及划分的各功能模块以及各模块的实体图和数据流图. 1.2预期的读 ...
- 备份Windows密钥,重装后免费激活系统教程
最重要的一点:在你重装系统之前,一定要先备份Windows密钥,不然重装系统后就查询不了原来的密钥,从而无法免费激活. 1.查询系统密钥(注册表中查询) 打开 “运行”(快捷键 win + R) 打开 ...
- 【计算机视觉】交并比IOU概念理解
前言 交并比IOU(Intersection over Union)是一种测量在特定数据集中检测相应物体准确度的一个标准. 图示 很简单,IoU相当于两个区域重叠的部分除以两个区域的集合部分得出的结果 ...