HDU 1160 结构体与dp

#include <bits/stdc++.h>
using namespace std;
const int MAX_V = 1005;
struct mice
{
	int n, s, w, dp, f;
	bool operator<(mice &p)
	{
		if (w != p.w) return w < p.w;
		else return s > p.s;
	}
};
int num, ans;
mice inp[MAX_V];
istream & operator>>(istream &is, mice &p)
{
	is >> p.w >> p.s;
	p.n = num + 1;
	p.dp = 1;
	p.f = -1;
	num++;
	return is;
}
void print(int ans)
{
	if (inp[ans].f != -1)
		print(inp[ans].f);
	cout << inp[ans].n << endl;
}
void solve()
{
	for (int i = 1; i < num; i++)
	{
		for (int j = 0; j < i; j++)
			if (inp[i].w > inp[j].w && inp[i].s < inp[j].s && inp[i].dp < inp[j].dp + 1)
			{
				inp[i].dp = inp[j].dp + 1;
				inp[i].f = j;
			}
		ans = (inp[i].dp >= inp[ans].dp ? i : ans);
	}
	cout << inp[ans].dp << endl;
	print(ans);
}
int main(int argc, char const *argv[])
{
	while (cin >> inp[num]);
	sort(inp, inp + --num);//因为读入eof,num比实际大1
	solve();
	return 0;
}
使用了递归来逆序输出。题目本质是最长下降子序列。
使用了结构体来保存dp;
更换了比较符号的写法,更简洁;
做这题花了很长时间,还是应该吧思路理清楚;

你可能感兴趣的:(HDU 1160 结构体与dp)