DAG上的动态规划
嵌套矩形问题(最长路及其字典序)
有n个举行,选出尽量多的矩阵排成一排,使得除了最后一个之外,每一个矩形可以嵌套在下一个矩形内,并且打印
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cctype>
#include <string>
#include <queue>
#include <map>
#include <set> using namespace std; const int INF = 0xffffff;
const double esp = 10e-;
const double Pi = * atan(1.0);
const int maxn = + ;
const long long mod = ;
const int dr[] = {,,-,,-,,-,};
const int dc[] = {,,,-,,-,-,};
typedef long long LL; LL gac(LL a,LL b){
return b?gac(b,a%b):a;
}
int n;
bool graph[maxn][maxn];
struct G{
int a,b;
};
G g[maxn];
int d[maxn][maxn];
bool judge(int x,int y){
if(g[x].a < g[y].a && g[x].b < g[y].b)
return ;
if(g[x].a < g[y].b && g[x].b < g[y].a)
return ;
return ;
}
int dp(int i,int tt){
if(d[tt][i] > )
return d[tt][i];
d[tt][i] = ;
for(int j = ;j <= n;j++){
if(graph[i][j]){
d[tt][i] = max(d[tt][i],dp(j,tt)+);
}
}
return d[tt][i];
}
void print_ans(int i,int tt){
printf("%d ",i);
for(int j = ;j <= n;j++){
if(graph[i][j] && d[tt][i] == d[tt][j] + ){
print_ans(j,tt);
break;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
// freopen("output.txt","w",stdout);
#endif
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = ;i <= n;i++){
getchar();
char ch;
scanf("%c%d%d",&ch,&g[i].a,&g[i].b);
//int fin = -1;
for(int j = ;j < i;j++){
if(judge(i,j)){
graph[i][j] = ;
}
if(judge(j,i)){
graph[j][i] = ;
}
}
}
int ans = -;
int m;
memset(d,,sizeof(d));
for(int i = ;i <= n;i++){
int tmp = dp(i,i);
if(tmp > ans){
m = i;
ans = tmp;
}
}
printf("%d\n",ans);
print_ans(m,m);
}
return ;
}
硬币问题
有n种硬币,面值分别为v1,v2,v3……给定非负整数s问选用多少个硬币使面值恰好等于s?求出硬币数目最大值和最小值……
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cctype>
#include <string>
#include <queue>
#include <map>
#include <set> using namespace std; const int INF = 0xffffff;
const double esp = 10e-;
const double Pi = * atan(1.0);
const int maxn = + ;
const long long mod = ;
const int dr[] = {,,-,,-,,-,};
const int dc[] = {,,,-,,-,-,};
typedef long long LL; LL gac(LL a,LL b){
return b?gac(b,a%b):a;
}
int V[maxn];
int minv[maxn];
int maxv[maxn];
int d[maxn];
int n;
int dp(int i){
if(d[i] != -)
return d[i];
d[i] = -INF;
for(int j = ;j <= n;j++){
if(i >= V[j]){
d[i] = max(d[i],dp(i - V[j])+);
}
}
return d[i];
}
void print_ans(int * a,int s){
for(int i = ;i <= n;i++){
if(s >= V[i] && a[s] == a[s -V[i] ]+){
printf("%d ",V[i]);
print_ans(a,s-V[i]);
break;
}
}
}
void print_Ans(int *a,int s){
while(s){
printf("%d ",a[s]);
s -= a[s];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
// freopen("output.txt","w",stdout);
#endif
while(~scanf("%d",&n)){
int s;
scanf("%d",&s);
for(int i = ;i <= n;i++){
scanf("%d",&V[i]);
}
d[] = ;
for(int i = ;i <= s;i++)
d[i] = -;
minv[] = maxv[] = ;
for(int i = ;i <= s;i++){
minv[i] = INF;
maxv[i] = -INF;
}
int min_coin[maxn];
int max_coin[maxn];
for(int i = ;i <= s;i++){
for(int j = ;j <= n;j++){
if(i >= V[j]){
if(minv[i] > minv[i - V[j]]+){
minv[i] = min(minv[i],minv[i-V[j] ] + );
min_coin[i] = V[j];
}
if(maxv[i] < maxv[i-V[j] ]+){
maxv[i] = max(maxv[i],maxv[i -V[j] ]+);
max_coin[i] = V[j];
}
minv[i] = min(minv[i],minv[i-V[j] ] + );
maxv[i] = max(maxv[i],maxv[i -V[j] ]+);
}
}
}
print_Ans(min_coin,s);
printf("\n");
print_Ans(max_coin,s);
printf("\n");
printf("%d %d\n",minv[s],maxv[s]);
print_ans(minv,s);
printf("\n");
print_ans(maxv,s);
printf("\n");
int ans = dp(s) ;
if(ans < -){
printf("no problem\n");
}
else{
printf("%d\n",ans);
}
}
return ;
}
DAG上的动态规划的更多相关文章
- UVa 103 Stacking Boxes --- DAG上的动态规划
UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...
- DAG上的动态规划之嵌套矩形
题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...
- UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)
传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...
- 第九章(二)DAG上的动态规划
DAG上的动态规划: 有向无环图上的动态规划是学习DP的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 1.没有明确固定起点重点的DAG模型: 嵌套矩形问题:有n个矩形,每个矩形可 ...
- DAG 上的动态规划(训练指南—大白书)
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.矩形嵌套 题目描述: ...
- DP入门(2)——DAG上的动态规划
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.DAG模型 [嵌套矩形问题] 问题 ...
- 嵌套矩形——DAG上的动态规划
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.非常多问题都能够转化为DAG上的最长路.最短路或路径计数问题. 题目描写叙述: 有n个矩形,每一个矩 ...
- DAG上的动态规划---嵌套矩形(模板题)
一.DAG的介绍 Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己. 摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都 ...
- 9.2 DAG上的动态规划
在有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路,最短路或路径计数问题 9.2.1 DAG模型 嵌套矩形问题: 矩形之间的可嵌套关系是一种典型的二元关系,二元关系可以 ...
- UVA 437 The Tower of Babylon(DAG上的动态规划)
题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...
随机推荐
- ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式
一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并 ...
- Python 数据处理扩展包: pandas 模块的DataFrame介绍(创建和基本操作)
DataFrame是Pandas中的一个表结构的数据结构,包括三部分信息,表头(列的名称),表的内容(二维矩阵),索引(每行一个唯一的标记). 一.DataFrame的创建 有多种方式可以创建Data ...
- Observer设计模式【利用商品概念解释】
每个人都想过着富有的生活,这是很正常的. 这里以开店进货为例. 在讲之前解释英语单词: Observer:查看:遵守 Observable:可见的,公开的. 从单词可以知道:商品用来卖,所以公开,继承 ...
- 介绍 32 位和 64 位版本的 Microsoft Office 2010
在使用 64 位版本的 Office 2010 运行现有解决方案时存在两个基本问题: Office 2010 中的本机 64 位进程无法加载 32 位二进制文件.在使用现有 Microsoft Act ...
- 高级UIKit-04(NSUserDefaults、NSKeyedArchiver、对象归档方法)
[day05_1_UserDefault]:判断应用程序是否是第一次运行 NSUserDefaults:用来保存应用程序的配置信息如:程序运行次数,用户登陆信息等. // 使用系统提供的NSUserD ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之敌方坦克AI的编写
在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写. 具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次 1.我们新建一个敌方坦克的AI类来控制 ...
- ESRI Shapefiles (SHP)
ESRI Shapefiles (SHP) Also known as ESRI ArcView Shapefiles or ESRI Shapefiles. ESRI is the company ...
- win7系统远程连接其它计算机,并且向远程机传输文件
首先,打开开始菜单,在程序自带的 “附件“ 中找到 "远程桌面连接"并打开,出现远程桌面对话框: 其次,在对话框左下角点击“选项”,选择“本地资源对话框”,在本地设备和资源下点击“ ...
- C#:总结页面传值几种方法
小知识点: 1. W7自带 .NetFrameWork 3.5, 兼容模式为 高版本号兼容低版本号: 2. WF和WPF都是基于XAML的,可是两者的用途不同. WF是一种开发框架,将工作流嵌入在. ...
- [TroubleShootin]The backup set holds a backup of a database other than the existing 'xxdb' database.
One: he backup set holds a backup of a database other than the existing 'xxdb' database Sometime ...