您的位置:首页 > 其它

hdu1160(最长上升子序列变形)

2016-12-08 20:58 295 查看
题目链接FatMouse's Speed

给出老鼠的体重和速度

求最长的序列,使得体重递增,速度递减

最长上升子序列变形

状态转移方程

if(mice[j].w>mice[i].w&&mice[j].s<mice[i].s){
if(dp[i]<dp[j]+1){
dp[i]=dp[j]+1;
pre[i]=j;
}
}


代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;

const int maxn=1005;

struct node
{
int w,s,ind;
bool operator <(const node &n)const{
if(w>=n.w)return true;
else if (w==n.w) return s<n.s;
else return false;
}

}mice[maxn];

int dp[maxn];
int pre[maxn];
int main()
{
//freopen("in.txt","r",stdin);
int w,s;
int ind=0,pos=0;
while(scanf("%d%d",&w,&s)!=EOF){
mice[ind].w=w;
mice[ind].s=s;
mice[ind].ind=ind+1;
ind++;
}
sort(mice,mice+ind);
for(int i=0;i<ind;i++)dp[i]=1;
memset(pre,-1,sizeof(pre));
for(int i=0;i<ind;i++){
for(int j=0;j<i;j++){
if(mice[j].w>mice[i].w&&mice[j].s<mice[i].s){ if(dp[i]<dp[j]+1){ dp[i]=dp[j]+1; pre[i]=j; } }
}
}
int ans=-1;
for(int i=0;i<ind;i++){
if(ans<dp[i]){
ans=dp[i];
pos=i;
}
}
printf("%d\n",dp[pos]);
while(pos!=-1){
printf("%d\n",mice[pos].ind);
pos=pre[pos];
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: