UVA - 242 线性DP
题意:给定多种邮票的组合,邮票最多只能用S张,这些邮票能组成许多不同面额,问最大连续面额的长度是多少,如果有多个组合输出组合中邮票数量最少的,如果仍有长度一致的,输出邮票从大到小排序后字典序最大的那个组合。
思路:d(i)表示面额为i的至少需要多少张邮票才能组成,转移方程d(i) = min(d(k) + d(i - k)),1 <= k < i.
注意:邮票数量不能超过S张,连续是指从1~max,也就是说连续必须以1作为开头,否则就算后面能组成更长的连续也不算。
AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<utility>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
const int maxn = 1000 + 5;
int d[15][maxn], len[15];
vector<int>s[15];
int solve(int S, int k) { //第k种邮票组合
int n = s[k].size();
//初始化边界
d[k][0] = 0;
for(int i = 0; i < n; ++i) d[k][ s[k][i] ] = 1;
int up = s[k][n-1] * S;
for(int i = 1; i <= up; ++i) {
if(d[k][i] != -1) continue;
d[k][i] = inf;
for(int j = 1; j < i/2 + 1; ++j) {
if(d[k][i] == -1 || d[k][i-j] == -1) continue;
d[k][i] = min(d[k][i], d[k][j] + d[k][i - j]); //inf + inf不会溢出
if(d[k][i] > S) d[k][i] = inf; //防止溢出
}
}
int ans = 0, cnt = 0;
for(int i = 1; i <= up; ++i) {
if(d[k][i] > S) break;
ans++;
}
return ans;
}
int main() {
int S, N, n, x;
while(scanf("%d", &S) == 1 && S) {
scanf("%d", &N);
for(int i = 0; i < N; ++i) s[i].clear();
for(int i = 0; i < N; ++i) {
scanf("%d", &n);
for(int j = 0; j < n; ++j) {
scanf("%d", &x);
s[i].push_back(x);
}
}
memset(d, -1, sizeof(d));
int ans = 0;
for(int i = 0; i < N; ++i) {
len[i] = solve(S, i);
ans = max(ans, len[i]);
}
int cur, k, l = inf;
for(int i = 0; i < N; ++i) {
if(len[i] == ans && l > s[i].size()) {
cur = i;
l = s[i].size();
}
}
for(int i = 0; i < N; ++i) {
if(i == cur) continue;
if(len[i] == ans && s[i].size() == l) { //长度相同且集合元素一样多
for(int j = l - 1; j >= 0; --j) {
if(s[cur][j] < s[i][j]) break;
else if(s[cur][j] > s[i][j]) {
cur = i;
break;
}
}
}
}
printf("max coverage =%4d :", ans);
for(int i = 0; i < s[cur].size(); ++i) printf("%3d", s[cur][i]);
printf("\n");
}
return 0;
}
UVA - 242 线性DP的更多相关文章
- uva 11584 Partitioning by Palindromes 线性dp
// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...
- uva 11552 Fewest Flops 线性dp
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
随机推荐
- 搭建Hadoop集群(centos6.7+hadoop-2.7.3)
hadoop集群有三种运行模式:单机模式.伪分布模式.完全分布模式.我们这里搭建第三种完全分布模式,即使用分布式系统,在多个节点上运行. 1 环境准备 1.1 配置DNS 进入配置文件,添加主节点和从 ...
- python初识 - day4
一.集合(set) 1.集合的定义 set 是一个无序的元素集合,支持并.交.差及对称差等数学运算, 但由于 set 不记录元素位置, 因此不支持索引.分片等类序列的操作. 2.集合的创建 大括号或 ...
- node 在控制台打印有色彩的输出
在学习 node 过程中,因为没有找到有断点的调试方法,只能退而次之,在控制台打印调试. 但整个控制台的输出都是一种颜色,有时候很难找到自己需要的信息,这时,有颜色的打印就会帮上很大的忙. conso ...
- Part 2:模型与后台管理admin站点--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- 【转】用Linux命令行获取本机外网IP地址
$ curl ifconfig.me $ curl icanhazip.com $ curl ident.me $ curl ipecho.net/plain $ curl whatismyip.ak ...
- 【视频编解码·学习笔记】5. NAL Unit 结构分析
在上篇笔记中通过一个小程序,可以提取NAL Unit所包含的的字节数据.H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用.下面将对NAL Unit中的数据进行 ...
- ResultSet详细
1. ResultSet细节1功能:封锁结果集数据操作:如何获得(取出)结果 package com.sjx.a; import java.sql.Connection; import java.sq ...
- [PHP]PDO占位符预处理在 IN 和 LIKE 中用法
两点注意项: 1. 占位符 (?) 必须被用在整个值的位置,不需要引号等其它字符. 2. 参数按数组元素顺序依次传递给占位符. <?php /** * PDO基于占位符的查询预处理 * * @l ...
- WTF小程序之wxs
前言 对于从VUE过来的前端同学来说,见到小程序的第一眼一定是熟悉-感觉就像是把vue的单文件拆成了3个文件.但是,随着慢慢入坑.马上会发现,这样怎么不行?wxs文件又是什么鬼?template和vu ...
- SQL Server中计算表达式的和
项目使用的是SQL Server数据库,需要做一个审核规则,字段A中表达式的值和字段B中的值,做比较: 需求本身很简单,但是表达式中存在很多非法字符(非法全角,运算符,汉字--) eg:1.1.1*2 ...