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;
}