基础动态规划题。
#include
#include
using namespace std;
const int MAXN = 1005;
struct mice //老鼠
{
int w; //重量
int s; //速度
int cnt; //序号
}m[MAXN];
int dp[MAXN]; //dp[i]表示i之前(包括第i个)满足条件的最长序列数
int pre[MAXN]; //pre[i]表示序列中i前面元素的索引
//老鼠排序标准,重量小的在前,重量相等时速度快的在前
bool cmp(mice a, mice b)
{
if (a.w == b.w) return a.s > b.s;
return a.w < b.w;
}
//递归输出子序列
void print(int pos)
{
if (pre[pos] != pos)
print(pre[pos]);
cout << m[pos].cnt << endl;
}
int main()
{
int n = 0; //老鼠的数量
while (cin >> m[n].w >> m[n].s)
{
m[n].cnt = n + 1;
++n;
}
sort(m, m + n, cmp);
memset(dp, 0, sizeof(dp));
int ans = 0; //最长子序列的长度
for (int i = 0; i < n; i++)
{
dp[i] = 1;
pre[i] = i;
for (int j = 0; j < i; j++)
{
if (m[i].s < m[j].s && m[i].w > m[j].w)
{
if (dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
pre[i] = j;
}
}
}
ans = max(ans, dp[i]);
}
int pos = 0; //子序列中最后一个元素的索引
for (int i = 0; i < n; i++)
{
if (ans == dp[i])
{
pos = i;
break;
}
}
cout << ans << endl;
print(pos);
return 0;
}
继续加油。