poj1015陪审团——DP+路径记录
题目: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+路径记录的更多相关文章
- POJ1015陪审团(Jury Compromise)——dp+路径记录
题目:http://poj.org/problem?id=1015 差值是有后效性的,所以“转化为可行性”,开一维记录“能否达到这个差值”. 当然可以开两维分别记录 a 和 b,但 “值只是0或1” ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
- POJ1015 && UVA - 323 ~Jury Compromise(dp路径)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
- DP+路径 URAL 1029 Ministry
题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...
- Charlie's Change_完全背包&&路径记录
Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...
- poj--3984--迷宫问题(bfs+路径记录)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status D ...
- ros机器人之小乌龟仿真-路径记录
------------恢复内容开始------------ 通过自己不断地摸索,对ros系统有了一定的了解,首先装系统,这一过程中也遇到了很多问题,但通过不断地尝试,经过一天一夜的倒腾,总算是把系统 ...
- Codeforces Round #598 (Div. 3)E(dp路径转移)
题:https://codeforces.com/contest/1256/problem/E 题意:给一些值,代表队员的能力值,每组要分3个或3个以上的人,然后有个评价值x=(队里最大值-最小值), ...
- Android中的路径记录
Android中的路径记录 | RobinBlog 导航 导航 博客 分类 标签 友链 关于 搜索 Environment.getDataDirectory().getPath()=/dataEnvi ...
随机推荐
- Python笔记 #05# Package & pip3
datacamp + 日常收集 How to install Package pip3 & What is difference between pip and pip3? Import P ...
- 使用MongoVUE无法添加Collection
说明: 问题MongoDB版本为3.2,MongoVUE 1.6.9 问题: 在数据库中添加集合不可用. 解决方法: MongoDB版本换成2 或者 切换存储引擎: 从MongoDB 3.2 版本开始 ...
- python_发送短信脚本
sendsms.py #!/usr/bin/env python # coding: utf-8 import sys import urllib import urllib2 "" ...
- POJ - 3254 Corn Fields(状压DP)题解
思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...
- 【Rpc】基于开源Dubbo分布式RPC服务框架的部署整合
一.前言 Dubbo 作为SOA服务化治理方案的核心框架,用于提高业务逻辑的复用.整合.集中管理,具有极高的可靠性(HA)和伸缩性,被应用于阿里巴巴各成员站点,同时在包括JD.当当在内的众多互联网项目 ...
- 51Nod 1419 最小公倍数挑战
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1419 题意: 思路: 要想最大,肯定去找尽量大的互质的数,如果不是互质的 ...
- 2018-2019-2 网络对抗技术 20165332 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165332 Exp1 PC平台逆向破解 NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP汇编指令:执行到NOP指令时,CPU仅仅当做一个 ...
- Rails 5 Test Prescriptions 第11章其他部分的测试。
Routes✅ Helper Methods✅ Controllers and Requests✅ Simulating Requests⚠️,看之前的博客 What to Expect in a R ...
- PHP--------微商城实现微信授权登录
前段时间做完微商城了,来把微信商城学到的一些东西分享一下,希望对各位有所帮助. PHP做后台,先来说微信商城的授权登录吧!这个几乎都有,这个功能代码其实不多,主要是看懂文档需求. 前提:要有公众号,和 ...
- UVALive-3268 Jamie's Contact Groups (最大流,网络流建模)
题目大意:你的手机通讯录里有n个联系人,m个分组,其中,有的联系人在多个分组里.你的任务是在一些分组里删除一些联系人,使得每个联系人只在一个分组里并且使人数最多的那个分组人数最少.找出人数最多的那个分 ...