动态规划----FatMouse’s Speed(HDU 1160)

来源:互联网 发布:泼墨软件下载 编辑:程序博客网 时间:2024/06/07 09:49

HDU 1160 —— FatMouse’s Speed

给定 n 只老鼠,每只老鼠有体重和速度,求老鼠的一个最长序列,使得体重严格递增,速度严格递减。给出这个序列的长度,并且输出这个序列中的每只老鼠在输入中的序号。


解题思路:先对所有老鼠排序,第一个关键字体重从小到大,第二关键字速度从大到小。然后求这个序列中的最长严格递增子序列。


dp[i] 记录以 i 只老鼠作为结尾的最长合法序列的长度,则有状态转移方程 dp[i]=max{dp[j]+1},0<=j<i, 只老鼠前面。

最后输出时,用栈的方式输出。

以下为代码:

#include<iostream>#include <algorithm>#include <vector>using namespace std;struct zc{    int w;    int s;    int n;}m[1005];int dp[1005];bool comp(const zc &a,const zc&b){    if(a.w!=b.w)        return a.w<b.w;    return a.s>b.s;}int max(int a,int b){if(a>b)return a;else return b;}int main(){    int i,j,k;    for(i=0;i<1005;i++)        dp[i]=1;    for(i=1;cin>>m[i].w>>m[i].s;i++)        m[i].n=i;    sort(m+1,m+i,comp);    int maxd=1;    for(j=2;j<i;j++)        for(k=1;k<j;k++)            if(m[k].w < m[j].w && m[k].s > m[j].s)            {                dp[j] = max(dp[k]+1, dp[j]);                 if(dp[j] > dp[maxd])                    maxd = j;            }    cout<<dp[maxd]<<endl;    int temp=maxd;    vector<int>mm;    mm.push_back(maxd);                       for(j=maxd-1;j>=1;j--)        if(dp[maxd]==dp[j]+1)        {            mm.push_back(j);            maxd=j;        }    for(j=dp[temp]-1;j>=0;j--)        cout<<m[mm[j]].n<<endl; }