HDOJ-1160-FatMouse's Speed:已AC,但留有疑惑【未解决】

#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<stack>
#include<cstring>
using namespace std;
#define Size 1000
struct Node
{
        int Weight, Speed;
        int index;
        bool operator < ( Node node )const{//最后这个const不可缺省 否则编译器报错 因为const对象调用非const成员函数非法
                return Weight < node.Weight;
        }
}mouse[Size+1];

int path[Size+1];
int table[Size+1];

int main()
{
        //ifstream cin("test.txt");
        int mice_num=1;
        while( cin>>mouse[mice_num].Weight>>mouse[mice_num].Speed ){
            mouse[mice_num].index=++mice_num;// 至今未理解 为何 mice_num++ WR···
        }

        sort(mouse+1, mouse+mice_num);

        int theLongest = 0;// 序列长度
        int theLastMouse; //  最长序列的最后一个老鼠
        memset(path, 0, sizeof(path));

        for( int i=1; i<mice_num; i++ ){// 基本动态转移过程
                table[i]=1;
                for( int j=1; j<i; j++ )
                        if( mouse[i].Weight>mouse[j].Weight && mouse[i].Speed<mouse[j].Speed && table[i]<table[j]+1 ){
                                table[i]=table[j]+1;
                                path[i]=j;
                        }
        }

        for( int i=1; i<mice_num; i++ )//遍历以求得 所要结果 当然也可以写进上一个 动态转移的循环中
            if( table[i]>theLongest )
            {
                    theLongest = table[i];
                    theLastMouse = i;
            }

        cout<<theLongest<<endl;
        stack<int>theSequence;// 由于自底向上的动态规划 求得最长序列 以及最后一个老鼠 而结果需要自顶向下输出 那么就利用堆栈罢
        while( table[theLastMouse]!=1 )
        {
                theSequence.push(mouse[theLastMouse].index);
                theLastMouse = path[theLastMouse];
        }
        theSequence.push(mouse[theLastMouse].index);
        while( !theSequence.empty() )
        {
                    cout<<theSequence.top()<<endl;
                    theSequence.pop();
        }
        return 0;
}

  

posted @ 2015-07-08 11:36  _SunDaSheng  阅读(126)  评论(0编辑  收藏  举报