题目:http://poj.org/problem?id=1015

DP的第一维是选了几个人,第二维是当前D与P的差值,而值存的是当前D与P的和;

技巧1:通过平移避免负角标,即代码中的fix;

技巧2:做完DP后找出最小的差的绝对值时,如下的那一小段代码很有效率;

技巧3(*):记录路径——①更新路径时每次判断是否重复选了一个人,重复则不更新;

if(f[j][k]+P[i]+D[i]>f[j+][k+P[i]-D[i]])
{
t1=j;t2=k;
while(t1>&&Path[t1][t2]!=i)//验证i是否在前面出现过
{
t2-=P[Path[t1][t2]]-D[Path[t1][t2]];
t1--;
}
if(t1==)
{
f[j+][k+P[i]-D[i]]=f[j][k]+P[i]+D[i];
Path[j+][k+P[i]-D[i]]=i;
}
}

记录路径1(转)

        int tmp=mk;
for(int j=m;j>;j--)
{
int pr=pre[j][tmp];
ans[j]=pr;
tmp-=(a[pr]-b[pr]);
}
sort(ans+,ans+m+);

记录路径1配套输出

             ②使用vector,每次更新暴力复制;(下面采用)

if(dp[i+][j+subtraction[k]] <= dp[i][j] + _plus[k])
{
dp[i+][j+subtraction[k]] = dp[i][j] + _plus[k];
path[i+][j+subtraction[k]] = path[i][j];//每次更新都要把path全部复制过来,就是因为这个才用的vector
path[i+][j+subtraction[k]].push_back(k);
}

记录路径2(转)

注意:(不知为何)DP顺序,必须是i+1被i更新,原来写的是i被i-1更新,一直WA。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,m,a[],b[],f[][],fix,t,ans[];
vector<int>pre[][];
int main()
{
while(scanf("%d%d",&n,&m)==)
{
t++;
memset(f,-,sizeof f);
memset(ans,,sizeof ans);
memset(pre,,sizeof pre);
if(!n&&!m)return ;
for(int i=;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
fix=*m;
// for(int k=0;k<=2*fix;k++)f[0][k]=0;
f[][fix]=;
for(int i=;i<=n;i++)//第i个人
for(int j=m-;j>=;j--)//选了j个
for(int k=;k<=*fix;k++)
{
// if(f[j-1][k-a[i]+b[i]]<0)continue;//
// if(f[j][k]<f[j-1][k-a[i]+b[i]]+a[i]+b[i])
// {
// f[j][k]=f[j-1][k-a[i]+b[i]]+a[i]+b[i];
//// pre[j][k]=i;
// pre[j][k]=pre[j-1][k-a[i]+b[i]];
// pre[j][k].push_back(i);
// }
if(f[j][k] >= )
{
if(f[j+][k+a[i]-b[i]]<=f[j][k]+a[i]+b[i])
{
f[j+][k+a[i]-b[i]]=f[j][k]+a[i]+b[i] ;
pre[j+][k+a[i]-b[i]]=pre[j][k];
pre[j+][k+a[i]-b[i]].push_back(i);
}
}
}
int mk;
// for(int k=fix;k<=2*fix;k++)
// if(f[m][k]>0)
// {
// mk=k;break;
// }
// for(int k=fix;k>=0;k--)
// {
// if(fix-k>=mk-fix)break;
// if(f[m][k]>0)
// {
// mk=k;break;
// }
// }
int j=;
while(f[m][fix-j]<&&f[m][fix+j]<)j++;
if(f[m][fix-j]>f[m][fix+j])mk=fix-j;
else mk=fix+j;
int d=(f[m][mk]+(mk-fix))/;
int p=(f[m][mk]-(mk-fix))/;
// int tmp=mk;
// for(int j=m;j>0;j--)
// {
// int pr=pre[j][tmp];
// ans[j]=pr;
// tmp-=(a[pr]-b[pr]);
// }
// sort(ans+1,ans+m+1);
printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",t,d,p);
for(int i=;i<m;i++)
printf(" %d",pre[m][mk][i]);
printf("\n\n");
}
}

poj1015陪审团——DP+路径记录的更多相关文章

  1. POJ1015陪审团(Jury Compromise)——dp+路径记录

    题目:http://poj.org/problem?id=1015 差值是有后效性的,所以“转化为可行性”,开一维记录“能否达到这个差值”. 当然可以开两维分别记录 a 和 b,但 “值只是0或1” ...

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

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

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

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

  4. DP+路径 URAL 1029 Ministry

    题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...

  5. Charlie's Change_完全背包&&路径记录

    Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...

  6. poj--3984--迷宫问题(bfs+路径记录)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  7. ros机器人之小乌龟仿真-路径记录

    ------------恢复内容开始------------ 通过自己不断地摸索,对ros系统有了一定的了解,首先装系统,这一过程中也遇到了很多问题,但通过不断地尝试,经过一天一夜的倒腾,总算是把系统 ...

  8. Codeforces Round #598 (Div. 3)E(dp路径转移)

    题:https://codeforces.com/contest/1256/problem/E 题意:给一些值,代表队员的能力值,每组要分3个或3个以上的人,然后有个评价值x=(队里最大值-最小值), ...

  9. Android中的路径记录

    Android中的路径记录 | RobinBlog 导航 导航 博客 分类 标签 友链 关于 搜索 Environment.getDataDirectory().getPath()=/dataEnvi ...

随机推荐

  1. lombok常见注解

    一.使用lombok简化代码 lombok提供了很多注解,在编译时候生成java代码,代替了手工编写一些简单的代码,使程序员可以关注更重要的实现. 二.常用注解 以model为例 public cla ...

  2. bzoj1009 / P3193 [HNOI2008]GT考试

    P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...

  3. linux及安全第四周总结——20135227黄晓妍

    总结部分: 用户态和内核态: 前提知识:cpu有几种不同指令执行的级别 用户态:代码的掌控范围受限制 内核态:高级别,代码课执行特权指令,访问任意物理地址. 权限设置的意义:没有的话,系统容易啊崩溃, ...

  4. 2017-2018-1 JaWorld 团队作业--冲刺7

    2017-2018-1 JaWorld 团队作业--冲刺7 冲刺博客 冲刺1 冲刺2 冲刺3 冲刺4 冲刺5 项目完成情况 存在的问题 存在的问题是敌机只设置了一种,没能实现多种敌机的游戏设置. 界面 ...

  5. 如何在官网下载JDK(版本、系统类型、字节位等)

    JDK官网地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 步骤1: 此步注意不要下载运行时jre

  6. noip2018 爆炸记

    noip2018 爆炸记 day-4 ~ day-2 最后考了两套模拟题,题目好水啊,但是我还是爆炸了. 第一套最后一道题竟然时一道毒瘤打表?但是我看着插头DP可做啊..(然而我并不会插头DP)然后还 ...

  7. mysql Alter 的问题

    转自:https://blog.csdn.net/c_enhui/article/details/50903351 -- 设置或删除列的默认值.该操作会直接修改.frm文件而不涉及表数据. 此操作很快 ...

  8. java学习之浅谈多线程1

    创建任务和线程 任务就是对象,为了创建任务,必须首先为任务定义一个类.任务类必须实现Runnable接口.Runnable接口非常简单,它只有一个run方法.需要实现这个方法来告诉系统线程将如何运行. ...

  9. JPA使用指南 javax.persistence的注解配置

    @SuppressWarnings("serial") @Entity @Table(name="T_X") public class X implements ...

  10. Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。

    10.测试文件上传 作者推荐的Paperclip,官方维护组已经不推荐使用deprecated. 推荐使用rails自带的 ActiveStorage. Active Storage: 推进文件上传到 ...