Vijos1392拼拼图的小衫[背包DP|二维信息DP]
背景
小杉的幻想来到了经典日剧《死亡拼图》的场景里……
被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……)。
突然广播又响了起来,歹徒竟然又有了新的指示。
小杉身为新一代的汤浅,有责任带领大家脱离危险!
(若对情节有任何疑问,请观看原剧)
描述
歹徒告诉小杉,他正在寻找的拼图块其实可以拼成N个 有顺序的 完整的拼图。
每个完整的拼图由若干个拼图块组成。
歹徒要求小杉把拼图按拼出的顺序划分成M个集合,一个拼图集合由若干个完整的拼图组成,并且总的拼图块的数目不超过T。并且,构成集合的拼图是不能交叉的,例如,当拼图1与拼图3被放在拼图集合1中之后,拼图2就只能放进拼图集合1或者不放进任何拼图集合。
小杉要找出划分成M个集合后,M个集合中最多能有多少个完整的拼图。
格式
输入格式
每组测试数据的
第一行有三个,为N,M,T(1<=N,M,T<=1000)
第二行有N个数,按照拼出拼图的顺序给出N个拼图分别含有多少个拼图块(拼图块的个数是不超过T的正整数,并且你不必考虑在现实中是否真正存在该个数的拼图)。
特别地,对于30%的数据,有1<=N,M<=100
输出格式
对每组数据输出一行一个数字,为M个拼图集合最多包含的拼图个数
样例1
样例输入1
6 2 4
1 1 3 1 2 2
样例输出1
5
限制
每个测试点1s
提示
对于样例数据,1个可行的方案如下
拼图集合1放拼图1和拼图2,
拼图集合2放拼图5和拼图6
于是最多可以放4个拼图
并且显然不存在能够放4个以上拼图的方案
来源
lolanv
-----------------------
题意:长度n的序列分成m段,每段选若干元素,使得总段数w不超过t,且选的最多
-----------------------
一开始想f[i][j][k]表示i个分j段,最后一段的w为k的最多拼图个数
然后像背包一样转移,不选i或者选i,选的话可能是从本段来的,也可能是刚好新开一段
把i滚动数组掉,维护一个mx[i][j]表示i个分j段段最大值,方便新开一段这个转移
注意f[i][j][0]=mx[i-1][j-1]
然后竟然做出来了,虽然很慢
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int n,m,t,w[N];
int f[N][N],mx[N][N];
void dp(){
for(int i=;i<=n;i++)
for(int j=m;j>=;j--){f[j][]=mx[i-][j-];
for(int k=t;k>;k--){
int &now=f[j][k];
if(k-w[i]>=) now=max(now,f[j][k-w[i]]+);
mx[i][j]=max(mx[i][j],now);
//printf("%d %d %d %d\n",i,j,k,now);
}
}
}
int main(int argc, const char * argv[]) {
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
dp();
cout<<mx[n][m];
return ;
}
另一种很神的思路是,把后两个状态和状态值对换
f[i][j]=c(a,b)表示前i个选j个的段数为a且额外要b个段数
有点类似可行性,注意初始化
速度好快
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=,INF=1e5;
int n,m,t,w[N],ans=;
struct data{
int a,b;
data(int x=INF,int y=INF):a(x),b(y){}
};
data min(data x,data y){
if(x.a<y.a) return x;
if(x.a>y.a) return y;
if(x.a==y.a) return x.b<y.b?x:y;
return x;
}
data f[N][N];
void dp(){
for(int i=;i<=n;i++) f[i][]=data(,);
for(int i=;i<=n;i++)
for(int j=;j<=i;j++){
data tmp;
if(w[i]+f[i-][j-].b<=t){tmp.a=f[i-][j-].a;tmp.b=f[i-][j-].b+w[i];}
else{tmp.a=f[i-][j-].a+;tmp.b=w[i];}
f[i][j]=min(f[i-][j],tmp);
if(f[i][j].a<m) ans=max(ans,j);
//printf("%d %d %d %d\n",i,j,f[i][j].a,f[i][j].b);
}
}
int main(int argc, const char * argv[]) {
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<=n;i++) scanf("%d",&w[i]);
dp();
cout<<ans;
return ;
}
Vijos1392拼拼图的小衫[背包DP|二维信息DP]的更多相关文章
- NOIP2009pj道路游戏[环形DP 转移优化 二维信息]
题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编 ...
- 微信小程序条码、二维码生成模块
代码地址如下:http://www.demodashi.com/demo/13994.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 微信小程序生成带参二维码
需求:生成小程序中的海报,需要小程序二维码可以使用户保存到本地在朋友圈分享 生成二维码工具类代码如下: package com.aone.foottalk.action.wx.util; import ...
- 关于.NET HttpClient方式获取微信小程序码(二维码)
随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档文档,结合网上的例子,未看到 ...
- dp --- 二维dp + 最大上升子序列
<传送门> 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74477 Accepted: 27574 ...
- 微信小程序之生成二维码
最近项目中涉及到小程序的生成二维码,很是头疼,经过多次摸索,整理出了自己的一些思想方法,如有不足,欢迎指正. 首先完全按照小程序的结构依次填坑. pages--index.wxml <view ...
- 微信小程序,获取二维码
微信小程序,获取二维码 找到一篇很实用的博客,他已经写得很详细了,自己也懒得写,亲测有效 参考网址
- dp 二维乃至多维背包
洛谷P1855 榨取kkksc03 分析:套路是很明显的01背包,但是这时受约束的变量有两个了,这种情况下就该用多维背包了 分析方法一样的,用dp[i][j][k]表示从前i个愿望中挑选总时间和总金钱 ...
- HDU 2159 FATE (DP 二维费用背包)
题目链接 题意 : 中文题不详述. 思路 : 二维背包,dp[i][h]表示当前忍耐值为i的情况下,杀了h个怪得到的最大经验值,状态转移方程: dp[i][h] = max(dp[i][h],dp[i ...
随机推荐
- CSS盒子模型
2016-10-22 <css入门经典>第6章 1.每个HTML元素对应于一个显示盒子,但不是所有的元素都显示在屏幕上. 2.HTML元素显示为CSS显示盒子的真正方法称为"可视 ...
- 原生JS实现轮播+学前端的感受(防止走火入魔)
插件!插件!天天听到有人求这个插件,那个插件的,当然,用第三方插件可以大幅提高开发效率,但作为新手,我还是喜欢自己来实现,主要是我有时间! 今天我来给大家分享下用原生JS实现图片轮播的写法 前辈们可以 ...
- jQuery.clean()方法源码分析(一)
在jQuery 1.7.1中调用jQuery.clean()方法的地方有三处,第一次就是在我之前的随笔分析jQuery.buildFramgment()方法里面的,其实还是构造函数的一部分,在处理诸如 ...
- 客户端调用服务端webservice的端口问题
今天有一个同事过来问:他有一个程序在A服务器上调第三方B服务器短信发送服务接口(webservice),无论是否发送成功,服务接口都会返回状态.现在客户要做每一个服务器 做入站端口管控,一切不必要的端 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q4-Q5)
Question 4 You are designing a SharePoint 2010 application to store 50 GB of digital assets, includi ...
- xmpp整理笔记:聊天信息的发送与显示
任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示 往期回顾: xmpp整理笔记:环境的快速配置(附安装包) http://www.cnblogs.com/dsxniubilit ...
- 防止IOS6与IOS7图标不一致
点击AppIcon在属性栏内找到iOS icon is pre-rendered打上勾. 如果之前已经安装过,需要先把APP卸载掉再安装.(因为模拟器有缓存) xcode4版本的话需要在INFO内增加 ...
- iOS 学习 - 10下载(2) NSURLSession 图片 篇
使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...
- 使用国内 maven 镜像 代替国外 mirror
使用maven的都知道国外的maven下载一个是比较慢,一个是因为被墙,一些jar包无法下载,非常老火. 比如出现类似下面的错误: Unknown host repo.maven.apache.org ...
- MongoDB Sharding、库、collection设计学习汇总
sharding设计须考虑的几个因素 Sharding Key的选择 在片键的选择上,最好是能够在字段中选择混合型的片键,大范围的递增健.和随机分布的健组合,如按月份递增.按用户名 ...