动态规划,寻找最长上升子序列问题

题目链接

FatMouse's Speed

 

题目大意:

给定一些老鼠的体重和速度,要求找出一些序列,体重逐渐增加,速度逐渐减小。要求输出序列中老鼠的个数与编号,答案不唯一。典型的最长是上升子序列问题,但是这个输出编号不会弄。网上找的博客是定义一个数组,数组中存储这个编号的上一只老鼠,即可找出所有符合要求的老鼠的编号。

#include 
#include 
#include 
#include 
using namespace std;
 
struct data
{
	int w, s;
	int i;
};
 
data num[1005];
int dp[1005];
int d[1005];
 
int cmp(data a, data b)
{
	if(a.w != b.w)
		return a.w < b.w;
	else
		return a.s > b.s;
}
 
int main()
{
	freopen("C:\\Users\\23535\\Desktop\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取 
	freopen("C:\\Users\\23535\\Desktop\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中 
//	freopen("3.txt", "r", stdin);
	int n = 1, i, j;
	int maxlen = 0, maxindex = -1;
	for(i = 0; i < 1005; i++)
		dp[i] = 1;
	memset(d, 0, sizeof(d));
	while(cin >> num[n].w >> num[n].s)
	{
		num[n].i = n;
		n++;
	}
	dp[1] = 1;
	sort(num + 1, num + n, cmp);
	for(i = 1; i < n; i++)
	{
		for(j = 1; j < i; j++)
		{
			if(num[i].w > num[j].w && num[i].s < num[j].s && dp[i] < dp[j] + 1)
			{
				dp[i] = dp[j] + 1;
				d[i] = j;
				if(maxlen < dp[i])
				{
					maxindex = i;
					maxlen = dp[i];
				}
			}
		}
	}
 
	int ans[1000];
	int t = maxindex;
	i = 0;
	while(t != 0)
	{
		ans[i++] = num[t].i;
		t = d[t];
	}
	cout<= 0; j--)
		cout << ans[j] << endl;
		fclose(stdin);//关闭重定向输入 
	fclose(stdout);//关闭重定向输出 
	return 0;
}

 

你可能感兴趣的:(暑假ACM)