给你每个物体两个参数,求最长的链要求第一个参数递增,第二个参数递减,要求输出任意最长路径。

首先第一反应根据第二个参数排个序,然后不就是最长上升子序列的问题吗?

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的更多相关文章

  1. FatMouse's Speed——J

    J. FatMouse's Speed FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...

  2. HDU 1160 FatMouse's Speed(要记录路径的二维LIS)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. HDU 1160 FatMouse's Speed (DP)

    FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Su ...

  4. FatMouse's Speed(HDU LIS)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. FatMouse's Speed 基础DP

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. zoj 1108 FatMouse's Speed 基础dp

    FatMouse's Speed Time Limit: 2 Seconds      Memory Limit:65536 KB     Special Judge FatMouse believe ...

  7. J - FatMouse's Speed

    p的思路不一定要到最后去找到ans:也可以设置成在中间找到ans:比如J - FatMouse's Speed 这个题,如果要是让dp[n]成为最终答案的话,即到了i,最差的情况也是dp[i-1],就 ...

  8. HDU 1160:FatMouse's Speed(LIS+记录路径)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. (最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160

    http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Other ...

随机推荐

  1. Unhandled event loop exception 解决办法

    网上搜索了一下.对其他人有效的办法有两种: 1. 安装了adsafe  .卸载掉就可以了. 2.安装了流氓软件:百度杀毒. 卸载掉也解决问题了 我就是第三种情况.到现在还没解决的热.!. 谁还有更好的 ...

  2. SQL server 2008数据库的备份与还原、分离(转)

    SQL server 2008数据库的备份与还原.分离(转)   一.SQL数据库的备份: 1.依次打开 开始菜单 → 程序 → Microsoft SQL Server 2008 → SQL Ser ...

  3. 大数值基础、for与while循环的简单对比

  4. php封装redis负载均衡类

    $array = array( 'master' => array( "redis://127.0.0.1:6379?timeout=1", ), 'slave' => ...

  5. 【搜索引擎Jediael开发4】V0.01完整代码

    截止目前,已完成如下功能: 1.指定某个地址,使用HttpClient下载该网页至本地文件 2.使用HtmlParser解释第1步下载的网页,抽取其中包含的链接信息 3.下载第2步的所有链接指向的网页 ...

  6. C# 当前程序所有线程

    using System.Linq; var threads = System.Diagnostics.Process.GetCurrentProcess().Threads;var count = ...

  7. Git commit template 模板设定

    多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...

  8. 函数 - PHP手册笔记

    用户自定义函数 函数无需在调用前被定义,除非是有条件定义的. PHP中的所有函数和类都具有全局作用域.PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数. 特意试了下,我的电脑上的PHP递归 ...

  9. xstream对象xml互转

    1.引入jar包 xpp3_min-1.1.4c.jarxstream-1.4.8.jar 2.建立java bean package com.jdw.bean; import java.util.A ...

  10. 初学swift笔记 继承(十)

    import Foundation /* 继承 class childClass: FatherClass{ } 优点 代码重用 缺点 增加程序的藕合度 父类的改变会影响子类 只能单继承 */ cla ...