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 ...
随机推荐
- Asp.Net 高性能ORM框架——SqlSugar
公司团队项目.产品已经完全抛弃EF,SqlSugar定位不是ORM,而是为了方便的让你去写Sql. SqlSugar 媲美原生ADO.NET的性能,语法简洁,并且支持 Json .Dynamic. L ...
- javassist和jdk动态代理
先来一个InvocationHandler示例,InvocationHandler类的作用是:对原始对象的方法做一个拦截. package com.zhang; import java.lang.re ...
- React-Router v4.0 hashRouter使用js跳转
React-Router v4.0上已经不推荐使用hashRouter,主推browserRouter,但是因为使用browserRouter需要服务端配合可能造成不便,有时还是需要用到hashRou ...
- Prism 4 文档 ---第11章 部署Prism应用程序
要成功移动Prism应用到生产中,需要对部署计划为应用程序的设计过程的一部分.本章介绍了注意事项和你需要采取的准备以部署应用程序,以及你要在用户手中获得部署程序所需要采取的行动. Si ...
- property 的详细使用方法
property(fget=None, fset=None, fdel=None, doc=None) 俗话说条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择. prop ...
- 吐血推荐:罗马尼亚无版权VPS服务商HostSolutions评测-绝对真实
要放心大胆的玩 VPS,要找性价比高.信用好,服务稳定,限制少的服务商是很不容易的.这里我先点几个黑名单:第一类 HiFormance.VirMach 低价流 VPS 服务商,以低从吸引消费者.俗话说 ...
- 自定义iconfont 图标库下载本地在移动App的使用及svg彩色图标
自定义iconfont 图标库扩展 在Hbuilder开发移动App的使用及svg彩色图标(或mui图标库的自定义扩展) 前提准备:1.登录阿里iconfont图标库,创建自己的项目,地址:http: ...
- TCP状态转化图 TIME_WAIT解析
先上转换图: 重点研究TIME_WAIT状态,根据UNIX网络编程中的思路,TIME_WAIT状态有两个存在的理由: 理由1. 客户端执行主动关闭,假设最终的ACK丢失,服务器将重新发送它的最后那个F ...
- ubuntu16.04 中文输入法
https://blog.csdn.net/qq_21792169/article/details/53152700 在主文件夹目录即home目录,按快捷键Ctrl+H(显示隐藏文件),看到的.bas ...
- 设置ip地址、掩码、网关、DNS
@echo offcolor f8mode con cols=40 lines=8echo.echo.echo 设置IP为:echo.set /p ip= 192. ...