bulaya


私信TA

用户名:505047661

访问量:19144

签 名:

等  级
排  名 819
经  验 3533
参赛次数 2
文章发表 22
年  龄 0
在职情况 学生
学  校 东莞理工学院
专  业

  自我简介:

TA的其他文章

解题思路:

动态规划:寻找最长递减序列

300 250 275 252 200 138 245

建立dp[]数组

用dp【i】来存从第一个到第i个的最长递减数列长度

第一个 300 所以dp[0]=1

第二个 250  250<300 可以加到300后面,变成300 250,所以dp[1]=2

第三个275   275>250但275<300 所以不能加到300 250后面,但可以加到300后面,所以dp[2]=2

……

显然,第i个数能不能加到一个递减数列的末尾的条件是(假设末尾的数为a[j]):a[i]<a[j]

为了保证求得的dp[i]是最长的递减数列,我们还要增加条件dp[i]<dp[j]+1(dp[i]初值为1)

如果满足上面条件,就让dp[i]=d[j]+1(以此来求得所有dp[])

最后从dp[]数组中求得最大值,就是题目所求



参考代码:

#include <stdio.h>
int main()
{
	int max, i, j, k, a[30], dp[30];

	k = 0;
	while (scanf("%d", &a[k++])!=EOF)
		;

	for (i = 0; i < k; i++) {
		dp[i] = 1;
		for (j = 0; j < i; j++) {
			if (a[j] > a[i] && dp[i] < dp[j] + 1)
				dp[i] = dp[j] + 1;
		}
	}

	max = 0;
	for (i = 1; i < k; i++)
		if (dp[max] < dp[i])
			max = i;

	printf("%d", dp[max]);

	return 0;
}


 

0.0分

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区