杭电OJ 1160(C++)

基础动态规划题。

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

继续加油。

你可能感兴趣的:(杭电OJ)