POJ1015 - Jury Compromise(DP+计算顺序)

POJ1015-Jury Compromise 以及 uva 323正确二维DP解法 楼主自己也是一个新手,发这个题解是为了让后来做这道题的人不被错误的程序误导,如有写的不好欢迎留言探讨。 这2道题是同一道,但是poj数据比较弱,许多过了的程序在uva上是过不了的,可能是很久之前有人发了一篇题解然后大家就模仿吧,毕竟二维DP比三维的速度要快多了。 我也属于小白,没做多少道DP题目,所以这道题纠结了我很久很久(2整天),最后还是在一位学长帮助下差不多弄明白了,还有此题网上的的三维 阅读详情

题目链接:

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


题目大意:

现在两个长度相等的序列, D 和P,现在要构造一个新的序列 A={a1,a2,a3⋯ak} 使得 ∣∣∑ki=1D[ai]−∑ki=1P[ai]∣∣ 尽量的小,如果有多解,要求 ∑ki=1(D[ai]+P[ai]) 尽量的大。


解题过程:

历经两天才A掉的这个题,刚开始定义的三维的状态,果断超时了,后来建去以为,以当前差值的绝对值为状态,但是这样好像会失解,最后看了下博客,发现不用取绝对值可以了。

但是这题要求输出路径,于是纠结好久如何输出路径,要保证一个元素不难重复使用的话,只能从后往前递推,如何这样之前的路径就可能被之后更新掉,原因应该是,以这样DP,不符合最优子结构,全局最优解不是局部最优解,然后局部的解被更新掉之后,输出路径的时候就错了。

最后又去看了下博客,发现别人都是从前往后递推,并且转移的时候检查下当前元素有没有被用过。从前往后推的话,就能保证当前状态向后找的路径是确定不变的了。


题目分析:

定义状态 dp[i][j] 为 ∑ji=1D[ai]−∑ji=1P[ai] 的结果为 i 时最大的∑ki=1D[ai]+P[ai]。

那么状态之间转移为:
设当前已选的元素的集合为 D

dp[i+D[k]−P[k]][j+1]=max(dp[i][j]+D[k]+P[k])∧1≤k≤n∧k∉D

关键在于如何判断 k∉D ,这里只需要去递归访问路径,查看 k 是否在当前状态的路径中。

做这道题的时候,真的意识到写递推DP时计算顺序是多么重要,要考虑循环的嵌套顺序,是循环变量从前往后还是从后向前,一个不同,含义就改变了许多。


AC代码

#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;

int reserve1[3123][30], reserve2[3123][30];
int (*dp)[30] = reserve1+1512;
int (*pre)[30] = reserve2+1512;
int D[212], P[212];

//判断k是否已经被选择
bool is_select(int i, int j, int k) {
    while (~pre[i][j]) {
        int t = pre[i][j];
        if (t == k)
            return true;
        t = D[t]-P[t];
        i -= t;
        j--;
    }
    return false;
}

int main() {
    int n, m, cases = 0;
    while (~scanf("%d %d", &n, &m) && (n+m)) {
        for (int i = 0; i < n; i++) {
            scanf("%d %d", D+i, P+i);
        }
        memset(reserve1, 0x80, sizeof(reserve1));
        memset(reserve2, -1, sizeof(reserve2));
        //初始化边界状态
        dp[0][0] = 0;

        //记录答案
        int ans_diff, ans_sum;
        vector<int> ans_path;
        ans_diff = INF, ans_sum = -INF;

        for (int i = -1000; i <= 1000; i++) {
            for (int j = 0; j < m; j++) {
                //如果当前为负数,表示当前状态不可到达
                if (dp[i][j] < 0) continue;
                for (int k = 0; k < n; k++) {
                    int t1 = D[k]+P[k];
                    int t2 = D[k]-P[k];
                    if (!is_select(i, j, k) && (dp[i][j] + t1 > dp[i+t2][j+1])) {
                        dp[i+t2][j+1] = dp[i][j] + t1;
                        pre[i+t2][j+1] = k;
                        //当j等于m时更新答案
                        if (j+1 == m && (abs(i+t2) < abs(ans_diff) || abs(i+t2) == abs(ans_diff) && dp[i+t2][j+1] > ans_sum)) {
                            ans_diff = i+t2;
                            ans_sum = dp[i+t2][j+1];
                        }
                    }
                }
            }
        }

        int sum1, sum2;
        sum1 = sum2 = 0;
        int pos = m;
        //递归的去寻找路径
        while (~pre[ans_diff][pos]) {
            int t = pre[ans_diff][pos];
            ans_path.push_back(t);
            sum1 += D[t];
            sum2 += P[t];
            t = D[t]-P[t];
            ans_diff -= t;
            pos--;
        }

        sort(ans_path.begin(), ans_path.end());
        printf("Jury #%d\n", ++cases);
        printf("Best jury has value %d for prosecution and value %d for defence:\n", sum1, sum2);
        for (int i = 0; i < ans_path.size(); i++)
            printf(" %d", ans_path[i]+1);
        printf("\n\n");
    }
}
HI3516CV610海思SOC:超高清智慧视觉开发全攻略 本文全面解析海思HI3516CV610 SOC在超高清智慧视觉开发中的应用。该芯片集成双核A7处理器、1Tops NPU、AI ISP及4K视频编码器,专为智能摄像头设计。文章详细介绍了开发环境搭建、核心硬件架构、媒体处理平台(MPP)实战、AI算法集成与系统调优等全流程攻略,帮助开发者高效构建稳定可靠的视觉AI产品。 阅读详情

相关推荐

KVNAND架构:解决边缘设备部署LLM的内存与带宽挑战

大语言模型(LLM)在边缘设备部署时面临内存容量和带宽限制的核心挑战。传统方案依赖DRAM存储KV缓存,导致高昂成本和性能瓶颈。闪存计算(IFC)通过计算单元下沉和流水线优化缓解部分问题,但仍受限于DRAM依赖。KVNAND架构创新性地将KV缓存直接存储在3D NAND闪存中,结合异构计算和页面级KV映射技术,显著降低延迟和能耗。该架构特别适用于长上下文场景,如文档分析和个人助理应用,能有效解决内存溢出(OOM)问题并提升计算单元利用率。关键技术包括头组并行(HG)执行和混合键合设计,为边缘AI部署提供了新

weixin_27215337的博客 320

STM32F767驱动WS2812B灯带避坑指南:从时序不准到抗干扰的实战调试

本文详细解析了STM32F767驱动WS2812B灯带的核心难点与解决方案,涵盖精确时序控制、硬件抗干扰设计及软件优化技巧。通过实战案例展示如何解决随机闪烁、颜色异常等问题,提供DMA+PWM驱动方案和超长灯带处理策略,帮助开发者实现稳定高效的WS2812B驱动。

weixin_30439067的博客 411

PaddleOCR多进程GPU推理实战:200万图片高效处理方案

本文详细介绍了PaddleOCR多进程GPU推理在高效处理200万张图片OCR任务中的实战方案。通过优化GPU利用率、多进程并发和关键参数调优,实现了从单进程3000张/小时到8进程3万张/小时的性能飞跃,为大规模OCR处理提供了可靠解决方案。

prometheus9mon的博客 261

Poj 1015

传送门:http://poj.org/problem?id=1015 大概就是有m个人,每个人有一个d值一个p值,从m个人中选出n个人,使得他们的d值和与p值和之差的绝对值最小,若有多个答案两数之差相同选其中d值和与p值和最大的。 也是背包问题。二维数组,dp[i][j],取i个人,差值为j,和放在dp[i][j]中,path[i][j]记录路径。 由于下标没有负数,将整个数组向右...

weixin_30654583的博客 139

【机电杂谈2】BLDC和PMSM的特点和区别

在日常生活中,小到电动玩具,大到电动汽车,永磁电机的身影可以说是无处不在。有刷直流电机、无刷直流电机、永磁同步电机由于其结构和输出特定的不同也被应用到不同的场合。如果你经常拆一些玩具和家电,就会看到大量的有刷直流电机和无刷直流电机,而永磁同步电机主要应用在高精度的工业伺服和电动汽车领域。本文就从电机的结构和控制方面,对这几种常见的永磁电机做简单的梳理和归纳。

2936

Android开发- (2)MediaProjection API实战:构建高效屏幕共享与远程控制方案

本文深入探讨了Android开发中利用MediaProjection API实现高效屏幕共享与远程控制方案的实战方法。文章从权限申请、虚拟屏幕创建讲起,详细解析了图像捕获、编码压缩、Socket网络传输的核心流程,并进一步介绍了如何构建双向控制通道及关键的性能优化与避坑指南,为开发者构建稳定可用的远程协作应用提供了完整路径。

weixin_29207533的博客 450

poj1015 Jury Compromise 题解报告

题目传送门 【题目大意】 要从n个候选人中选出m人作为陪审团,对于这n个候选人,每个人都有两个分数,一个是辩护方的分数,一个是起诉方的分数。要求一种方案,使得辩护方分数之和与起诉方分数之和的差最小而和最大。求这种方案下辩护方分数和起诉方分数。 【思路分析】 我们可以把这道题目看做是具有多个“体积维度”的0/1背包问题。把n个候选人看做n个物品,那么每个物品有以下三种“体积”: 1.“人数...

weixin_34364135的博客 285

爬虫瑞数5.5案例:欧冶钢材交易官网,带后缀K5nOZLud(面向对象补环境)

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。由于之前某通信的瑞数已经调整,这里再出一篇文章,瑞数特点以及请求执行的流程已在之前的文章中分析过,这里不再特别讲解;

老衲爱洗头的博客 3043

POJ1015-Jury Compromise【01背包,dp】

正题 题目链接:http://poj.org/problem?id=1015 题目大意 每个人有A值和B值,要求选M个人,使这M个人的|SumA−SumB||SumA−SumB||Sum_A-Sum_B|最小。 解题思路 我们用SumA−SumBSumA−SumBSum_A-Sum_B作为原本的价格,然后用fi,jfi,jf_{i,j}表示已经选了i个人,SumA−Sum...

QuantAsk 619

通过傅里叶变换进行音频变声变调

在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。

yang1fei2的博客 1815

利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记

前言 前面我学习了利用DTI构建白质纤维脑网络,并采用GRETNA计算了小世界网络属性。阅读文献发现可以利用灰质体积或皮层指标(皮层厚度、折叠指数、沟深)等构建结构协变网络再进行网络拓扑属性的计算。因此,我采用前面提取的灰质体积和皮质数据进行了结构协变网络分析,特此写下笔记以便后面的学习。 一、数据准备 二、构建结构协变网络 三、全局属性的统计分析 四、局部属性的统计分析 五、网络攻击分析 六、度的分布 ..................

weixin_52073820的博客 7496

POJ 1015 Jury Compromise

刚开始路径记录的时候用的状压,结果一直WA,然后对照官方数据,发现m虽然只有20,但n却是有200的 说多了都是泪啊,调了我好久 /*刚开始想了个递推方程,后来发现是不正确的-_-||因为这个方程不能保证无后效性。。。 dp[k][i][j]:前k个人中,选中m个人,sumd-sump的值。 递推方程:dp[k][i][j]=max(dp[k][i-1][j-(d[i]-p[i])]); 重

lj94093的专栏 453

【WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解

WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解

AI人人懂 593

[Poj 1015] Jury Compromise 解题报告 (完全背包)

题目链接:http://poj.org/problem?id=1015 题目: 题解: 我们考虑设计DP状态(因为这很显然是一个完全背包问题不是吗?) dp[j][k]表示在外层循环到i时,选了j个人,此时辩方总分和控方总分差值为k的时,辩方和控方的总分的和的最大值 dp[j][k+a[i]-b[i]] = max (dp[j][k + a[i] - b[i]] , dp[j][...

weixin_30384031的博客 129

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

poj1015 Jury Compromise

dp题,类似于01背包的转移 需要注意的是:背包容量在有的时候可能为负数,所以需要算出最大数据量整体平移 像01背包一样直接倒序循环j并不能保证每一个物品只选一个,两个等价的物品在计算时可能会重复使用 所以把i(物品)放在最后一维,通过chk函数来检查该物品此前是否已经选过,从而保证转移的正确性 继续锻炼思维…… Code: #include <cstdio>...

weixin_30819163的博客 102

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

poj 1015 Jury Compromise_dp

中等的dp题目

吹来的寒风 670

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ 1015 Jury Compromise dp

大致题意: 从n个候选人中选出m个人作为陪审团。为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与控方总和的差最小,如果有多个最小,选择辩方总和与空方总和的和最大的那个方案。 分析: 一开始以为就是普通的01背包,结果代码一写,WA了。后来发现|D[j]-P[j]|并不构成最优...

weixin_33719619的博客 68

AI产品经理的核心技能与大模型应用实践

在人工智能时代,大模型技术已成为推动产品创新的核心引擎。Transformer架构作为大模型的基石,通过自注意力机制实现高效的序列建模,而Prompt工程则是连接模型能力与业务需求的关键桥梁。从技术原理来看,大模型产品化需要构建包含数据预处理、模型微调(如LoRA技术)和结果后处理的完整pipeline,这要求产品经理具备跨领域的知识体系。在实际应用中,检索增强生成(RAG)等技术能显著提升知识密集型任务的效果,而合理的GPU资源管理和API成本控制则是商业落地的保障。无论是智能客服还是内容生成系统,成功的

weixin_34323858的博客 348

poj 1015 Jury Compromise

题目大意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团。选m 人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。为了公平起见,法官选出陪审团的原则是:选出的m 个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小。如果有多种选择方案的 ...

weixin_33968104的博客 120

POJ 1015 Jury Compromise(dp坑)

提议:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。选m人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小。如果有多种选择方案的辩方总分和控方总分的之差的绝对值相同...

weixin_34189116的博客 106

HDU2196 - Computer(树的直径+DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196题目大意:给定一个无向连通无环图,求每个节点到达的最远的节点的距离。解题过程:上午看了一下DP进阶之路的PDF,突然想学树型DP。然后找到了这个题,之前做了一个POJ的BFS求树的直径的,这次再来一发DP的。题目分析:由于题目给的是无向连通无环图,这里构造出一颗树来,不妨假设节点11为根。那么对于任

ACM_Fish的博客 817

DAG上的动态规划

不定终点的最长路:矩阵嵌套问题:题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=16题目大意:如果一个矩形的长和宽都大于另一个矩形,那么说这个矩形可以嵌套另一个矩形,现在有很多个矩形,输入矩形的长宽,求出他们的最大嵌套数。注意矩形的长宽是可以互换的。题目分析:这是一道经典的DAG上的动态规划问题,需要把问题转化成DAG上的最长路问题,把每个

ACM_Fish的博客 634

数位DP(模板)

推荐博客:http://zyk1997.github.io/2015/03/20/ShuWeiDP/模板题:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009http://acm.hdu.edu.cn/showproblem.php?pid=3555http://acm.hdu.edu.cn/showproblem.p

ACM_Fish的博客 613
上一篇: HDU1024 - Max Sum Plus Plus(DP+降维优化)
下一篇: LightOJ1370 - Bi-shoe and Phi-shoe(欧拉函数+打表)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值