您的位置:首页 > 其它

HDU 1160 FatMouse's Speed

2014-11-19 17:13 267 查看
水dp啊。

一维数组搞定。 先排序。 weigh 从小到大 如果相同 speed 从大到小

然后扫一遍就好了。 对于某一个位置 找出他之前的最大的位置就好。 d【】 要初始化为1

这个题要打印路径。 也简单。 对于任意一个位置。 只要找出 前面 数量最多的那个位置 用 fa【】 数组 记录一下就好。

以前最害怕打印路径的题了。 现在好多了。。

更新: 自己做完之后又去看了一下别人的做法。 简直弱爆了。 这个题还可以 按照 weigh 从小到大排序之后 求 speed 的最大下降子序列。。

#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAXN 1000+10
struct Mice{
    int we;
    int sp;
    int id;
    friend bool operator < (Mice a, Mice b){
        if(a.we != b.we)
            return a.we < b.we;
        else
            return a.sp > b.sp;
    }
};
int d[MAXN] = {0};
int f[MAXN] = {0};
Mice s[MAXN];
void dfs(int i){
    if(!f[i]){
        return ;
    }
    else{
        dfs(f[i]);
        printf("%d\n",s[f[i]].id);
    }
}
int main (){
    int x,y;
    int k = 1;
    memset(s,0,sizeof(s));
    while(scanf("%d%d",&s[k].we,&s[k].sp) != EOF){
        s[k].id = k,k++;
    }
    sort(s+1,s+k);
    int M = 0;
    for(int i = 0; i < k; i++)
        d[i] = 1;
    memset(f,0,sizeof(f));

    for(int i = 1; i < k; i++){
        for(int j = 1; j < i; j++){
            if(s[j].we < s[i].we && s[j].sp > s[i].sp){
                if(d[j]+1 > d[i]){
                    d[i] = d[j]+1;
                    f[i] = j;
                }
            }
        }
    }
    int wh = 0;
    for(int i = 1; i < k; i++){
        if(d[i] > M){
            wh = i;
            M = d[i];
        }
    }
    printf("%d\n",M);
    dfs(wh);
    printf("%d\n",s[wh].id);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: