hdu 1160
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1160相关的知识,希望对你有一定的参考价值。
题目给出不确定数量的老鼠的体重和速度,求一个最长序列,其中的老鼠体重递增,速度递减。最后输出序列的长度和老鼠的序号。LIS的变通题,由于要输出序列,所以下标从1开始,并且用pre记录上一个老鼠的位置
参考文章:http://www.voidcn.com/article/p-bcgohktj-bev.html
#include<cstdio>
#include<stack>
#include<algorithm>
#include<cstring>
using namespace std;
struct rat{
int wei,spe,id;
void init(int w,int s, int i){
wei=w,spe=s,id=i;
}
};
bool cmp(rat a, rat b){
return a.wei<b.wei;
}
const int maxn = 1005;
rat r[maxn];
int dp[maxn],pre[maxn];
int main(){
int len=1;
int w,s;
while(~scanf("%d %d",&w,&s)){
r[len].init(w,s,len);
len++;
}
len--;
sort(r+1,r+1+len,cmp);
memset(dp,0,sizeof(dp));
memset(pre,-1,sizeof(pre));
for(int i=1;i<=len;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(r[j].wei<r[i].wei&&r[j].spe>r[i].spe&&dp[j]+1>dp[i]){
pre[i]=j;
dp[i]=dp[j]+1;
}
}
}
int ans=max_element(dp+1,dp+1+len)-dp;
stack<int>out;
int lo=ans;
while(lo!=-1){
out.push(r[lo].id);
lo=pre[lo];
}
printf("%d\n",dp[ans]);
while(out.empty()==false){
printf("%d\n",out.top());
out.pop();
}
return 0;
}
以上是关于hdu 1160的主要内容,如果未能解决你的问题,请参考以下文章