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 ...
随机推荐
- 在linq查询环境下通过sql语句来访问数据库
接上一篇随笔 这里主要介绍在linq环境下,如果实现用sql来访问数据库,同时也介绍在EF框架中如何添加新的方法来访问数据库. 1.首先,在数据访问层(EF.DAO,EF.IDAO)中添加具体的函数来 ...
- 网页被Chrome识别成英语,区域,语言,网站
修改成这个后解决 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...
- .net web api 一
web api可以提供方便简单可靠的web服务,可以大量的用于不需要提供复杂的soap协议的环境,以简单明了的形式返回数据,在不太复杂的环境中web api可以做为wcf等重级web服务的一种可替代方 ...
- 对WEB标准以及W3C的理解与认识 - 提高网页加载速度
在写代码的时候应该注意: 1.标签闭合 2.标签小写 3.不能随意嵌套 提高被搜索引擎搜到几率: mate中的name变量[其中keywords和description尤其重要] Meta name= ...
- Spring配置扫描mybatis的mapper文件注意:
一般会将不业务的mapper文件放到不同的包中: spring配置扫描就需要配置下面的方式(两个*): <!-- mybatis文件配置,扫描所有mapper文件 --> <bean ...
- js 去掉字符串最后一个字符
var str = str.substring(0,str.length-1); alert(str); 注:length 需小写.
- 获取mssqlserver与access数据库插入的当前行的id
//mssqlserver public static int GetInsertId(string sql) { try { SqlCommand cmd = new SqlCommand(); u ...
- css3变形讲解
Transform变形:可以实现文字或者图片旋转.缩放.倾斜和移动,并且该元素下的所有子元素都随着父元素一样. 既然接触到transform,我们就可以做好多3d的效果啦 旋转:transform:r ...
- 构建混合云:配置Azure site to site VPN连接(1)
用户在构建自己云计算解决方案的时候,往往会选择私有云或者公有云来做部署,但在一些场景下,用户更加希望通过混合云的方案来满足自己的业务需求.Azure为混合云的部署提供多种不同的连接方案,最常见的是 ...
- 解析XML【C#】
1.XML元素XML元素包含一个开标记.元素中的数据.闭标记例如:<book>book name</book>其中book是元素名称 book name是元素数据元素名称区 ...