吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2674|回复: 1
收起左侧

[C&C++ 转载] 动态规划时实现记录最优解

[复制链接]
KaQqi 发表于 2019-4-20 10:17
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1259

思路1:通过记忆化递归模式dp(太简单了,不说了)
思路2:从dp过程状态转移的实际含义去实现

这个dp的含义就是当前位置的最长不下降序列的长度
所以就记录当前位置的上一个位置是多少

再定义一个数组去记录

但是这样貌似只能倒着打出来

然后先存数组里,再倒序打出,就变成正向了。
代码:
[Asm] 纯文本查看 复制代码
#include <stdio.h>

int data[201];
int dp[201];
int last[201];
int result[201];
int main()
{
	int n;
	
	scanf("%d",&n);
	for(int i = 0;i<n;i++)
	{
		scanf("%d",&data[i]);
	}
	dp[0] = 1;
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<i;j++)
		{
			if(data[j] <= data[i]) 
			{
				if(dp[j] + 1 > dp[i]) dp[i] = dp[j]+1;
				last[i] = j;
			}
		}
	}

	
	
	int max = 0;
	int max_pos;
	for(int i = 0;i<n;i++)
	{
		if(dp[i] > max)
		{
			 max=dp[i];
			 max_pos = i;
		}
	}
	printf("max=%d\n",max+1);
	int print = max_pos;
	for(int i = 0;i<=max;i++)
	{
		result[i] = data[print];
		print = last[print];
	}
	for(int i = max;i>=0;i--) printf("%d ",result[i]);
}

免费评分

参与人数 2吾爱币 +4 热心值 +2 收起 理由
一袋米要抗几楼 + 1 + 1 热心回复!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wushaominkk 发表于 2019-4-20 19:58
感谢您坚持发帖,吾爱因您更精彩!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 07:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表