[ACM_POJ_2533]Longest Ordered Subsequence

Longest Ordered Subsequence

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 21942 Accepted: 9441

Description
A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1

Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.

Input
The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output
Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.

Sample Input
7
1 7 3 5 9 4 8

Sample Output
4

Source

POJ2533

思路:

这道题用穷举暴力破解的话是很不明智的,因为当n增加时,运算量将是几何倍数增长。动态规划的三要素是阶段、状态、决策,我们以此来进行分析(按照我当前刚学动态规划的理解):

我们按照数字的编号划分阶段,那么以某个数字为结尾的最长子序列长度就是该阶段的状态,最优状态则是之前的最大子序列长度中的最大值,决策便是以当前数字为结尾的最长子序列长度 = 最优状态 + 1,我们用状态转移方程来表示:

a[n] = max({a[i] | 0 < i < n}) + 1

可得代码如下:

#include<stdio.h>
int main(){
	int n, ans = 1;
	scanf("%d", &n);
	int *num = new int[n];
	int *a = new int[n];
	for(int i = 0; i < n; ++i){
		scanf("%d", &num[i]);
		int max = 0;
		for(int j = 0; j < i; ++j){
			if(num[j] < num[i] && a[j] > max){
				max = a[j];
			}
		}
		a[i] = max + 1;
		if(a[i] > ans)
			ans = a[i];
	}
	printf("%d", ans);
}

唔,一次性AC大笑

本题的引申——[ACM_ZOJ_1733]Longest Common Subsequence(最长公共子序列)

后记:问了老师,原来这种做法还不算是动态规划,只是具备了动态规划的思想。

老师的说法:

比较普遍的一个例子,
动态规划可以看成一个二维数据,

每个a[i][j] 由 a[i-1][*] 的取值来决定,
一层一层的往上计算,每i层每一个元素近且只由第i-1层的元素计算而得。




=======================签 名 档=======================
原文地址(我的博客):http://www.clanfei.com/2012/04/464.html
欢迎访问交流,至于我为什么要多弄一个博客,因为我热爱前端,热爱网页,我更希望有一个更加自由、真正属于我自己的小站,或许并不是那么有名气,但至少能够让我为了它而加倍努力。。
=======================签 名 档=======================



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值