嵌套矩形问题(最长路及其字典序)
有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上的动态规划的更多相关文章

  1. UVa 103 Stacking Boxes --- DAG上的动态规划

    UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...

  2. DAG上的动态规划之嵌套矩形

    题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...

  3. UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)

    传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...

  4. 第九章(二)DAG上的动态规划

    DAG上的动态规划: 有向无环图上的动态规划是学习DP的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 1.没有明确固定起点重点的DAG模型: 嵌套矩形问题:有n个矩形,每个矩形可 ...

  5. DAG 上的动态规划(训练指南—大白书)

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.矩形嵌套 题目描述:       ...

  6. DP入门(2)——DAG上的动态规划

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.DAG模型 [嵌套矩形问题] 问题 ...

  7. 嵌套矩形——DAG上的动态规划

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.非常多问题都能够转化为DAG上的最长路.最短路或路径计数问题. 题目描写叙述: 有n个矩形,每一个矩 ...

  8. DAG上的动态规划---嵌套矩形(模板题)

    一.DAG的介绍 Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己. 摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都 ...

  9. 9.2 DAG上的动态规划

    在有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路,最短路或路径计数问题 9.2.1 DAG模型 嵌套矩形问题: 矩形之间的可嵌套关系是一种典型的二元关系,二元关系可以 ...

  10. UVA 437 The Tower of Babylon(DAG上的动态规划)

    题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...

随机推荐

  1. GDG shanghai programming one hour by JavaScript

    刚在昨天参加了一场JS入门编程的活动,目的就是提升对JS的兴趣. 因为是针对零基础开发者的,一上来就是“Hello World!”了 当然,想用JS输出"Hello World!" ...

  2. Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建(转)

    这篇文章主要讲解使用eclipse对Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建过程,包括里面步骤和里面的配置文件如何配置等等都会详细说明. 如果还没有搭建好环境( ...

  3. perl 5.22手动安装Mysql DBI和DBD

    mysql 手动安装DBI 和DBD: DBI版本: [root@dr-mysql01 DBD-mysql-4.033]# perl -MDBI -le 'print $DBI::VERSION;' ...

  4. Pencil OJ 02 安装

    Mongo 官方的安装方法 官方教程已经很好啦,这里就不罗嗦了. 源码编译 待补.我是从这里看到的. 遇到的问题 启动时的警告信息 2015-03-06T21:01:15.526-0800 I CON ...

  5. KINGSO介绍

    kingso_intro - Taocode KINGSO介绍 KINGSO是一种高效的垂直化的搜索引擎,其包含query解析.检索.过滤.统计.排序功能,不包含抓取部分.它对商品搜索做了针对性的优化 ...

  6. northern truck 是什么牌子?具体_百度知道

    northern truck 是什么牌子?具体_百度知道 northern truck 是什么牌子?具体

  7. SOA,不看你永远不知道的事

    你买不来SOA,只能设计自己的SOA. SOA不是新东西 SOA没有引入新概念,它是个把现有概念和实践放到一起,用于特定需求集的范式.你甚至可以说SOA别的什么都 不是,就是将实用主义和头脑风暴运用到 ...

  8. 高性能IO模型浅析(彩图解释)good

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  9. Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系

    devise.cancan和rolify这三个组件结合,可以建立完整而强大的用户权限模型. devise介绍,负责用户注册.登录.退出.找回密码等操作.细节参考devise on github can ...

  10. cocos2d-x游戏开发系列教程-中国象棋00-前言

    象棋描述 在说代码之前,我们先让象棋效果登场,以方便大家对代码的理解 欢迎界面 中国象棋程序,运行起来的第一个界面是一个欢迎界面,该欢迎界面在停留一秒后进入游戏界面 游戏主界面 新局:所有棋子归位,状 ...