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 ...
随机推荐
- Pandas DataFrame 数据选取和过滤
This would allow chaining operations like: pd.read_csv('imdb.txt') .sort(columns='year') .filter(lam ...
- hibernate一级缓存和二级缓存的区别
http://blog.csdn.net/defonds/article/details/2308972 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了 ...
- SQL基础用法(实例一)
/* 2006年10月01日 SQL Server 数据库的基本操作 (1) 数据库的创建 (2) 数据表的创建以及相关约束的指定(含临时表) (3) 数据的添/删/改 (4) 数据的查询 */ () ...
- 一、WCF学习之旅-创建第一个服务
WCF基本介绍:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fDfG ...
- javascript的replace之正则表达式的浅析
在javascript中,字符串的replace方法可以指定替换某些字符串. 1.直接替换字符串 "yy/MM/dd".replace("yy","2 ...
- 对于for循环和while循环,两种形式的优缺点
1.for循环 一般用于知道循环次数,并且for循环可以节省内存以及代码简洁,在循环语句中定义一个局部变量,循环结束后,局部变量就被释放了. ;val<=;val++) { sum+=val; ...
- L1-051 打折
去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情.例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60.本题就请你写个程序替客户计算折扣价. 输入格式: ...
- 打开TestFlight并链接到具体的应用下载界面
在我们应用正式上线前,许多时候都会有小流量的测试,选取部分核心用户抢先试用,在TestFlight出来之前,一般都是通过企业证书打包,然后提供给用户下载地址,安装测试使用,这个有个不爽之处就是,企业i ...
- 使用Mockito时遇到的一些问题
最近在使用Mockito时遇到了几个比较tricking的问题,在这里记录一下. 1.如果方法的参数或者返回类型是泛型通配符相关的(如<?>,<? extends XXX>), ...
- LibSVM文件转换为csv格式
Spark MLlib 的官方例子里面提供的数据大部分是 libsvm 格式的.这其实是一种非常蛋疼的文件格式,和常见的二维表格形式相去甚远,下图是里面的一个例子: libsvm 文件的基本格式如下: ...