zoj1108 FatMouse's Speed
给你每个物体两个参数,求最长的链要求第一个参数递增,第二个参数递减,要求输出任意最长路径。
首先第一反应根据第二个参数排个序,然后不就是最长上升子序列的问题吗?
O(nlogn)的复杂度,当然这样可以写,写法也不难。
然后发现这个还是个DAG,也可以用拓扑排序来搞定,输出最长路径,复杂度O(n*n),更新的时候需要更新并记录每个点的前节点,最后倒序输出。
第二种就当练练手吧
先上第二种代码:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
int d;
struct node
{
int x,y;
}h[1005];
vector<int> t[1005];
int deg[1005];
queue<int> q;
int g[1005];
int ans=0;
int res=-1;
int dp[1005];
vector<int> s;
void tp()
{
for(int i=0;i<d;i++)
{
if(deg[i]==0)
{
dp[i]=1;
q.push(i);
}
}
while(!q.empty())
{
int xx=q.front();
if(dp[xx]>ans)
{
ans=dp[xx];
res=xx;
}
q.pop();
for(int i=0;i<t[xx].size();i++)
{
int w=t[xx][i];
deg[w]--;
if(dp[w]<dp[xx]+1)
{
dp[w]=dp[xx]+1;
g[w]=xx;
}
if(deg[w]==0)
q.push(w);
}
}
} int main()
{
//freopen("input.txt","r",stdin);
int a,b;
memset(g,-1,sizeof(g));
while(scanf("%d%d",&a,&b)==2)
{
h[d].x=a;
h[d].y=b;
d++;
}
for(int i=0;i<d;i++)
for(int j=0;j<d;j++)
{
if(h[i].x<h[j].x&&h[i].y>h[j].y){
t[i].push_back(j);
deg[j]++;
}
}
tp();
printf("%d\n",ans);
s.push_back(res+1);
while(g[res]!=-1)
{
s.push_back(g[res]+1);
res=g[res];
}
int len=s.size();
for(int i=len-1;i>=0;i--)
printf("%d\n",s[i]);
}
第一种代码稍后补上:
参考http://blog.csdn.net/dangwenliang/article/details/5728363
原理:O(N*N)的,一维,设dp[i]为以第i位为结尾的最长长度,dp[i]=max(dp[j])+1(j<i),然后记录前缀,输出路径。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
int d;
struct node
{
int x,y,r;
}h[1005];
int hh[1005];
int g[1005];
vector<int> t;
bool cmp(node a,node b)
{
if(a.y>b.y)
return 1;
return 0;
}
int f[1005];
int ans,res;
int main()
{
//freopen("input.txt","r",stdin);
int a,b;
memset(g,-1,sizeof(g));
while(scanf("%d%d",&a,&b)==2)
{
h[d].x=a;
h[d].y=b;
h[d].r=d;
d++;
}
sort(h,h+d,cmp);
hh[0]=1;
int res=-1;
ans=0;
for(int i=1;i<d;i++)
{
hh[i]=1;
for(int j=0;j<i;j++)
{
if(h[i].x>h[j].x&&hh[i]<hh[j]+1)
{
hh[i]=hh[j]+1;
g[i]=j;
if(hh[i]>res)
{
ans=i;
res=hh[i];
}
}
}
}
printf("%d\n",res);
t.push_back(ans);
while(g[ans]!=-1)
{
t.push_back(g[ans]);
ans=g[ans];
}
int len=t.size();
for(int i=len-1;i>=0;i--)
{
printf("%d\n",h[t[i]].r+1);
}
}
然后来O(nlogn)算法。
首先能这么做,要满足dp的两个根本原则:1.无后效性,每一个点的状态都由其前面的点决定
2.每一步都是当前那一个整体最优。
我们必须用到二分,但是这个前面的点的序列是不连续的,所以我们需要选出前面的点中每一步中的最优,来组成一个"标杆队列",因为对于数和数之间的前后关系是重要的,但对于当前的数,前面的数的前后关系是不重要的,如果每一次二分,dp的同时维护那个"标杆队列",我们可以保证那个队列是最优的,那么下一个点也会是最优的,也可以保证结果是最优的。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
int d=1;
struct node
{
int x,y,r;
}h[1005];
int ans[1005];
int hh[1005];
int dp[1005];
bool cmp(node a,node b)
{
if(a.y>b.y)
return 1;
else if(a.y==b.y&&a.x>b.x)
return 1;
return 0;
} int main()
{
//freopen("input.txt","r",stdin);
int a,b;
while(scanf("%d%d",&a,&b)==2)
{
h[d].x=a;
h[d].y=b;
h[d].r=d;
d++;
}
sort(h+1,h+d,cmp);
for(int i=1;i<d;i++)
ans[i]=10005;
int len=0;
for(int i=1;i<d;i++)
{
int t=lower_bound(ans+1,ans+d,h[i].x)-ans;
ans[t]=h[i].x;
dp[i]=t;
len=max(len,t);
}
printf("%d\n",len);
int cc=len;
int res=0;
int f=10005;
for(int i=d-1;i>0;i--)
{
if(len==0)
break;
if(dp[i]==len&&h[i].x<f)
{
hh[res++]=i;
len--;
f=h[i].x;
}
}
for(int i=res-1;i>=0;i--)
{
printf("%d\n",h[hh[i]].r);
}
}
zoj1108 FatMouse's Speed的更多相关文章
- FatMouse's Speed——J
J. FatMouse's Speed FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...
- HDU 1160 FatMouse's Speed(要记录路径的二维LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1160 FatMouse's Speed (DP)
FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- FatMouse's Speed(HDU LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- FatMouse's Speed 基础DP
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- zoj 1108 FatMouse's Speed 基础dp
FatMouse's Speed Time Limit: 2 Seconds Memory Limit:65536 KB Special Judge FatMouse believe ...
- J - FatMouse's Speed
p的思路不一定要到最后去找到ans:也可以设置成在中间找到ans:比如J - FatMouse's Speed 这个题,如果要是让dp[n]成为最终答案的话,即到了i,最差的情况也是dp[i-1],就 ...
- HDU 1160:FatMouse's Speed(LIS+记录路径)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- (最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160
http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Other ...
随机推荐
- Sql语句之查询所有学生所有科目分数及总分
昨天练Sql语句,数据库建了四个表分别是,学生表,课程表,成绩表以及教师表(教师表不在讨论范围),突然想到以前高中时代老师手上的那张成绩表,然后我就寻思着能不能用Sql语句把表打印出来,以下是我的思考 ...
- HDU 5730 - Shell Necklace
题意: 给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案 分析: 可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]* ...
- illegal to have multiple occurrences of contentType with different values (old: text/html; charset=UTF-8, new: text/html; charset=utf-8)
问题描述: 在a.jsp通过<%@ include file="b.jsp" %> 的方式引入b.jsp,但是报了标题的中的错误, 问题原因: 在a.jsp的头部: & ...
- java中静态代码块的用法 static用法详解
(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...
- Android识别图片中脸部信息
在Android开发中,大部分应用都是以用户为第一位,用户都有自己的个人中心,用来展示自己的信息,头像无疑是展示自己最直观的方式,随着各种政策的出台,实名认证,真人头像变得尤为重要,如果要求上传真人头 ...
- phpStudy速度慢的解决办法
1.修改mysql数据库链接地址为ip地址127.0.0.1. 2.使用最新版本,这个坑了我好久时间.
- 使用委托解决"线程间操作无效: 从不是创建控件“textBox1”的线程访问它" 问题
在winform编程中常遇到此类问题,造成辅助线程无法给控件赋值 //定义委托 private delegate void SetTextCallback(string text); //在给text ...
- 服务端无法获取到Ajax发送post请求的参数
js类似于这样: function send() { var xhr = new XMLHttpRequest(); xhr.open("post", "AjaxTest ...
- Inno Setup GIF 显示插件 GIFCtrl (V2.1 版本)
原文 http://restools.hanzify.org/article.asp?id=79 引用来自 test.iss ; -- test.iss --; restools; http://r ...
- 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS
http://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/ 关于Makefile.am中与Bui ...