题目: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+路径记录的更多相关文章

  1. POJ-1015 Jury Compromise(dp|01背包)

    题目: In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting ...

  2. poj1015陪审团——DP+路径记录

    题目:http://poj.org/problem?id=1015 DP的第一维是选了几个人,第二维是当前D与P的差值,而值存的是当前D与P的和: 技巧1:通过平移避免负角标,即代码中的fix: 技巧 ...

  3. $POJ1015\ Jury\ Compromise\ Dp$/背包

    洛谷传送门 $Sol$ 这是一道具有多个“体积维度”的$0/1$背包问题. 把$N$个候选人看做$N$个物品,那么每个物品有如下三种体积: 1.“人数”,每个候选人的“人数”都是$1$,最终要填满容积 ...

  4. 【poj1015】 Jury Compromise

    http://poj.org/problem?id=1015 (题目链接) 题意 随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m 人组成陪审团.选m人的办法是:控方和辩方会根据对候选人的喜欢 ...

  5. POJ 1015 Jury Compromise dp分组

    第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...

  6. 【POJ1015】Jury compromise 多个费用的背包

    这是一道比较综合的动态规划问题. 首先,根据题目中的从N个人中选出M个人,并且要使得某个目标函数最优,可以想到是背包问题,且因为要取出M个人,人数也应该作为背包体积的一个维度. 其次,要求输出路径,因 ...

  7. [IOI1999]花店橱窗布置(DP路径记录)

    题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...

  8. POJ 1015 Jury Compromise dp

    大致题意: 从n个候选人中选出m个人作为陪审团.为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与 ...

  9. POJ1015 && UVA - 323 ~Jury Compromise(dp路径)

    In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...

随机推荐

  1. Java远程调试 java -Xdebug各参数说明

    JAVA自身支持调试功能,并提供了一个简单的调试工具--JDB,类似于功能强大的GDB,JDB也是一个字符界面的 调试环境,并支持设置断点,支持线程线级的调试 JAVA的调试方法如下: 1.首先支持J ...

  2. Centos7 docker 常用指令

    Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上 一.docker的安装及卸载 1.查看当前系统内核版本: [root@docker ~]# uname - ...

  3. python dict sorted 排序

    https://www.cnblogs.com/linyawen/archive/2012/03/15/2398292.html 我们知道Python的内置dictionary数据类型是无序的,通过k ...

  4. linux processes

    So that Linux can manage the processes in the system, each process is represented by a task_struct   ...

  5. ajax缓存和编码问题

    ajax缓存问题,工作中几乎使用ajax都会碰到,虽然解决缓存问题很多,但我 一直使用常用的,方便理解的,没有多大记忆成本的,get方式的缓存问题很蛋疼,尤其是低版本IE啦,废话少说, <scr ...

  6. POJ 3308 Paratroopers 最大流,乘积化和 难度:2

    Paratroopers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7267   Accepted: 2194 Desc ...

  7. [转]VirtualBox中的网络连接方式详解

    如果出现主机无法ping通虚拟机的情况,请首先确认虚拟机防火墙已关闭. 一.NAT模式 特点: 1.如果主机可以上网,虚拟机可以上网 2.虚拟机之间不能ping通 3.虚拟机可以ping通主机(此时p ...

  8. .net大型分布式电子商务架构说明

    背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 架构演变 基础框架剥 ...

  9. Delphi中的文件扩展名

    Filename Extensions in Delphi http://delphi.about.com/od/beginners/a/aa032800a.htm Try building a sm ...

  10. sql server的远程连接

    当一台服务器上的数据库需要用到另一台服务器上的数据库时,就需要远程连接 首先创建远程连接 exec sp_addlinkedserver linkname,'','SQLOLEDB',serverIP ...