FatMouse's Speed

pid=1160">http://acm.hdu.edu.cn/showproblem.php?pid=1160

最长递增子序列问题的一个变体。实际上跟最长递增子序列问题没有不论什么本质的差别。

定义一个结构体mice,设mice[i].w表示第i仅仅老鼠的重量,mice[i].s表示第i仅仅老鼠的速度。对mice结构体进行排序。以w为第一keyword,递增。s为第二keyword,递减。设dp[i]表示以mice[i]为结尾的最长序列的长度。考虑某一个dp[i]。则有:

dp[i] = max(dp[i], dp[j]+1) (1<=j<i,且mice[i].w>mice[j].w。mice[i].s < mice[j].s)

当中,初始条件为dp[i]=1 (i=1, 2, ..., n)

排序的过程中须要加一个变量记录其原始的位置,由于终于的输出是原始的排序。

贴上AC代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct mouse
{
int w;
int s;
int index;
};
mouse mice[1005];
int dp[1005];//dp[i]表示以mice[i]为结尾的最长递增子序列
int pre[1005];//pre[i]记录i的上一个数据
int res[1005];//存放终于的结果
bool cmp(mouse a,mouse b)
{
if(a.w!=b.w)
return a.w<b.w;
return a.s>b.s;
} int main()
{
freopen("1160.in","r",stdin);
freopen("1160.out","w",stdout);
int i=1,j;
while(cin>>mice[i].w>>mice[i].s)
{
dp[i]=1;
pre[i]=0;
mice[i].index=i;
i++;
}
int n=i-1;
sort(mice+1,mice+1+n,cmp);
int maxlen=0;//最长序列长度
int end;//最长序列的末尾下标
dp[1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(mice[i].w>mice[j].w&&mice[i].s<mice[j].s&&dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
pre[i]=j;
if(dp[i]>maxlen)
{
end=i;
maxlen=dp[i];
}
}
}
}
int t=end;
i=0;
while(t!=0)
{
res[i++]=t;
t=pre[t];
}
cout<<i<<endl;//i指向总数
while(i>0)
{
i--;
cout<<mice[res[i]].index<<endl;
}
return 0;
}

HDOJ1160 Fat Mouse&#39;s Speed的更多相关文章

  1. HDU 1160 FatMouse&#39;s Speed(DP)

    题意  输入n个老鼠的体重和速度   从里面找出最长的序列  是的重量递增时速度递减 简单的DP  令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度  对与每一个老鼠i  遍历全部老鼠j  当 ...

  2. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. HDU 1160 FatMouse&#39;s Speed (最长有序的上升子序列)

    题意:给你一系列个w,s.要你找到最长的n使得 W[m[1]] < W[m[2]] < ... < W[m[n]] and S[m[1]] > S[m[2]] > ... ...

  4. HDU 1160 FatMouse&#39;s Speed DP题解

    本题就先排序老鼠的重量,然后查找老鼠的速度的最长递增子序列,只是由于须要按原来的标号输出,故此须要使用struct把三个信息打包起来. 查找最长递增子序列使用动态规划法.主要的一维动态规划法了. 记录 ...

  5. HD1160FatMouse's Speed(最长单调递增子序列)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. ACM Greedy Mouse

    Greedy Mouse 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 A fat mouse prepared M pounds of cat food,read ...

  7. 一位学长的ACM总结(感触颇深)

    发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...

  8. JS----贪吃蛇游戏

    在网上找到的几种例子 <!DOCTYPE html> <html > <head> <meta http-equiv="Content-Type&q ...

  9. Selenium如何支持测试Windows application

    很长一段时间大家都支持Selenium是只支持测试Web应用程序的. 纵观Selenium的成长历程,不难解释这个原因.Selenium开始的时候是作为一个Firefox中的插件出现的,而且做得是纯J ...

随机推荐

  1. Python学习-day9 线程

    这节内容主要是关于线程的学习 首先要了解的什么是进程,什么是线程 进程与线程 什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称 ...

  2. 为什么要用全文搜索引擎:全文搜索引擎 VS 数据库管理系统

    正文一:Full Text Search Engines vs. DBMS  发表于2009年 正文二:Elasticsearch - A High-Performance Full-Text Sea ...

  3. 【转】C#学习之用迭代器实现枚举器

    http://www.cnblogs.com/zouzf/archive/2012/02/22/2362954.html 本人初学C#,本文仅供个人整理思路用,那里说得不对,请大家多多指教,万分感激! ...

  4. iOS---->CADisplayLink、比NSTimer更精确的定时器

    什么是CADisplayLink CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器.我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个r ...

  5. 关于 lambda expression 返回值的类型转换

    lambda expression(lambda 表达式,$\lambda$ 表达式) 是 C++ 11 引入的特性. 一般而言,lambda 表达式的返回值类型可不指定,而由返回值推断. 需要注意的 ...

  6. HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. 报错:java.lang.IllegalStateException

    java.lang.IllegalStateException: BeanFactory not initialized or already closed - call '“refresh”' be ...

  8. 【CCF】网络延时 树搜索

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  9. leetcode 20 简单括号匹配

    栈的运用 class Solution { public: bool isValid(string s) { stack<char>The_Stack; ; The_Stack.push( ...

  10. hdu 1250 树形DP

    Anniversary party Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...