HDU 1160 FatMouse's Speed DP题解

本题就先排序老鼠的重量,然后查找老鼠的速度的最长递增子序列,不过因为需要按原来的标号输出,故此需要使用struct把三个信息打包起来。


查找最长递增子序列使用动态规划法,基本的一维动态规划法了。

记录路径:只需要记录后继标号,就可以逐个输出了。



#include 
#include 
using namespace std;

const int MAX_N = 1005;

struct MouseSpeed
{
	int id, w, s;
	bool operator<(const MouseSpeed &ms) const
	{
		return w < ms.w;
	}
};

int N;
MouseSpeed msd[MAX_N];
int post[MAX_N], tbl[MAX_N];

int main()
{
	N = 0;
	while (~scanf("%d %d", &msd[N].w, &msd[N].s))
	{
		msd[N].id = N+1;
		++N;
	}

	sort(msd, msd+N);	//fullfill condition 1: weight increase
	fill(tbl, tbl+N, 1);//initialize dynamic table

	post[N-1] = N-1;
	for (int i = N-2; i >= 0; i--)
	{
		post[i] = i;	//as the print out terminate term
		for (int j = i+1; j < N; j++)
		{
			if (msd[i].s>msd[j].s && msd[i].w!=msd[j].w && tbl[i]





你可能感兴趣的:(Algorithm算法)