UVA103 dp基础题,DAG模型
1、UVA103 嵌套n维空间 DAG模型记忆化搜索,或者 最长上升子序列。
2、dp[i]=max( dp[j]+1),(第i个小于第j个)
(1)
//DAG模型记忆化搜索
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 1e6+, M=; int n,m;
int box[M][M],dp[M],fa[M],vis[M],G[M][M];
bool jBigi(int a,int b)
{
FF(i,,m) if(box[a][i]>=box[b][i]) return false;
return true;
}
int D(int x)
{
if(vis[x]) return dp[x];
vis[x]=;
int &ans=dp[x]=;
FF(i,,n) if(G[x][i] && ans<D(i)+) {
ans=D(i)+, fa[x]=i;
}
return ans;
}
void print_ans(int mi)
{
printf("%d\n", dp[mi]);
int first=;
while(mi!=-) {
if(!first) printf(" "); first=;
printf("%d", mi);
mi=fa[mi];
}
printf("\n");
}
int main()
{
while(~scanf("%d%d", &n,&m)) {
FF(i,,n) {
FF(j,,m) scanf("%d", &box[i][j]);
sort(box[i]+,box[i]++m);
} mes(G,); mes(vis,); mes(fa,-);
FF(i,,n) FF(j,,n) if(jBigi(i,j)) G[i][j]=;
int maxn=-INF, mi;
FF(i,,n) {
dp[i]=D(i);
if(maxn<dp[i]) maxn=dp[i], mi=i;
}
print_ans(mi);
} return ;
}
(2)
//最长上升子序列
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const long long LINF = 1e18+1LL;
const int N = 1e5+, M = ; int dp[M],fa[M],n,m;
struct box
{
int di[M],ord;
void Sort() { sort(di+,di+m+); }
friend bool operator < (const box & a, const box & b) {
FF(i,,m) if(a.di[i]>b.di[i]) return false; //注:这里不能>=,必须>。因为是重载<,要尽可能使a<b
return true;
}
}B[M]; bool jBigi(int a,int b)
{
FF(i,,m) if(B[a].di[i]>=B[b].di[i]) return false;
return true;
}
void print_ans(int mi)
{
printf("%d\n", dp[mi]);
int first=;
while(mi!=-) {
if(!first) printf(" "); first=;
printf("%d", B[mi].ord);
mi=fa[mi];
}
printf("\n");
}
int main()
{
while(~scanf("%d%d", &n,&m))
{
FF(i,,n) {
FF(j,,m) scanf("%d", &B[i].di[j]);
B[i].Sort(); B[i].ord=i;
}
sort(B+,B++n);
mes(fa,-);
int maxn=-INF, mi;
for(int i=n; i>; --i) { dp[i]=;
for(int j=n; j>i; --j) {
if(jBigi(i,j) && dp[i]<dp[j]+) {
dp[i]=dp[j]+, fa[i]=j;
}
if(maxn<dp[i]) maxn=dp[i], mi=i;
}
}
print_ans(mi);
} return ;
}
UVA103 dp基础题,DAG模型的更多相关文章
- hdu 2089 不要62 (数位dp基础题)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- poj 2955 Brackets (区间dp基础题)
We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...
- poj2642 The Brick Stops Here(DP基础题)
比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在 ...
- hdu 2845(dp基础题)
题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> # ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
- HDU3853 LOOPS 期望DP基础题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题目大意(只是大意,名字什么的可能和原题描述不一样~): 爱丽丝与华容道 题目描述 爱丽丝是一个 ...
- POJ Corn Fields 状态压缩DP基础题
题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...
- POJ 2342 Anniversary party 树形DP基础题
题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...
- 牛客假日团队赛5 K 金币馅饼 (DP 基础题)
链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
随机推荐
- 浅谈CPU和GPU的区别
导读: CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景.CPU需要很强的通用性来处理各种不同的数据类型,而GPU面对的则是类型高度统一的.相互无依赖的大规模数据 ...
- spring框架学习(三)
一.Spring自动组件扫描 Spring 提供组件扫描(component scanning)功能.它能从指定的classpath里自动扫描.侦测和实例化具有特定注解的组件. 基本的注解是@Comp ...
- STM32学习及应用笔记一:SysTick定时器学习及应用
这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...
- jquery简单的轮播效果!
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- Eclipse Java注释模板设置详解
设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...
- Linux中的用户和用户组
在Linux中,有三种用户: Root 用户:也称为超级用户,对系统拥有完全的控制权限.超级用户可以不受限制的运行任何命令.Root 用户可以看做是系统管理员. 系统用户:系统用户是Linux运行 ...
- ble示例代码
ble代码下载: https://github.com/sutogan4ik/Android-BLE-GATT-Master-Slave
- MongoDB的分片(9)
什么是分片 分片是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里, ...
- 【Java EE 学习 71 下】【数据采集系统第三天】【分析答案实体】【删除问题】【删除页面】【删除调查】【清除调查】【打开/关闭调查】
一.分析答案实体 分析答案实体主要涉及到的还是设计上的问题,技术点几乎是没有的.首先需要确定一下答案的格式才能最终确定答案实体中需要有哪些属性. 答案格式的设计是十分重要的,现设计格式如下: 在表单中 ...
- 【转载】关于treeview的多层显示的科学用法!
http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-b ...