J - FatMouse's Speed

J - FatMouse’s Speed

题目入口:J - FatMouse’s Speed

解题思路

这道题要求我们排出最大的体重越来越大速度越来越慢的老鼠序列.
首先我们需要一个结构体存放每个老鼠的信息
体重 速度 编号
一个带自定义cmp函数的sort函数排出按体重升序的顺序(这里注意如果体重相等,则让速度快的排前面)
好了 现在我们开始dp
对于一只老鼠1,我们看它后面体重比它大速度比它慢的老鼠2,如果有,取老鼠2得到的最大值加上老鼠1(dp[j]+1)和老鼠1当前最大值(dp[i])的最大值
最后取dp[i]中最大值即为答案
注意本题要求输出路径
那我们我们再加一段代码输出路径
思路是从头遍历老鼠们
如果选取老鼠i得到的最大值(dp[i])为目前最优结果(Max)
说明它是我们的天选之鼠,把它输出出来
我们的最优结果随之减少一个鼠额
随着一个又一个天选之鼠的输出
最优结果已到零则结束挑选

AC代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MaxSize 1010  //注意依题更改数组大小
int dp[MaxSize];    //存放当前最大不连续递增子列长度
struct mice{
    int w;
    int s;
    int index;
}m[1005];
bool cmp(mice x, mice y){
    if (x.w == y.w) return x.s > y.s;
    return x.w < y.w;
}
int main() {
    int pos = 1, x, y;
    while (scanf("%d%d", &x, &y)!=EOF){
        m[pos].w = x;
        m[pos].s = y;
        m[pos].index = pos;
        pos++;
    }
    sort(m+1, m+pos+1, cmp);
    int Max = 0;
    for (int i = pos; i >= 1; i--){
        dp[i] = 1;
        for (int j = i; j <= pos; j++){
            if (m[j].w > m[i].w && m[j].s < m[i].s){
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        Max = max(Max, dp[i]);
    }
    printf("%d\n", Max);
    for (int i = 1; i <= pos; i++){
        if (dp[i] == Max){
            printf("%d\n", m[i].index);
            Max--;
        }
        if (!Max) break;
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值