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 ...
随机推荐
- sql 数据库显示 正在恢复
问题原因:Sql Server 一直显示正在恢复.有事务未恢复或者还原数据库造成 处理办法: 步骤一:数据库上右键->任务->分离 步骤二:数据库上右键->任务->脱机 数据库 ...
- Vue 框架中遇到的诀窍
问题一. 我需要渲染数组A,并根据 B数组中是否存在A中,给A添加 选中状态sel. 经过很焦虑的研究后,寻求帮助得到答案. 1.初始化数据时 A添加属性flag(bool)标识,如果B中存在A中某个 ...
- oracle查询在当前数据库下当前用户拥有的表语句
1.查询表的数目: select count(*) from tabs select count(*) from user_tables 2.查询用户拥有哪些表: select * from tabs ...
- Redis (一) 概念安装
一.阿里云安装Redis 1.安装Redis yum -y install redis 2.启动Redis service redis start 或者(推荐使用) systemctl start ...
- Java——object类
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- CUDA ---- Shared Memory
CUDA SHARED MEMORY shared memory在之前的博文有些介绍,这部分会专门讲解其内容.在global Memory部分,数据对齐和连续是很重要的话题,当使用L1的时候,对齐问题 ...
- 和不安全的Android说再见,Google为它添加新铠甲
伴随着最近被曝出的Heartbleed漏洞,安全问题再次成为网络上的热点话题.虽然Android的安全性并没有外界传言的那样脆弱,但Google还是在继续为其增加防护措施.根据Android官方博客的 ...
- Tomcat结合nginx使用入门
Nginx: Nginx是一款高性能,轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 特点是:占有内存少,并发能力强. 反向代理服务器: 反向代理(Reverse ...
- Oracle text组件安装
1.目标:在数据库中,安装Oracle Text组件: 970473.1 MOS文档ID 2.组件相关视图:查询验证 #查询DB中的组件: #视图:USER_REGISTRY (注册) COM ...
- android中的5大布局
1.线性布局:LinearLayout layout_margin 上下左右的距离分别为 下面图中的orientation表示的是布局中的方向 分别有horizontal表示水平 vertic ...