动态规划经典五题

本文介绍了五个经典的动态规划问题,包括最大连续子序列之和、数塔问题、01背包问题、最长递增子序列和最长公共子序列。通过状态转移方程详细解析每个问题的解决思路,并提供相关代码片段作为参考。
摘要由CSDN通过智能技术生成

DP一年多没碰过了,今天突然想找找感觉,找了经典的几道DP复习着敲了敲。虽然最大子矩阵,滑雪,石子合并等问题也足够经典,我还是从中找了5道最经典的DP写了这篇博文,如果您是大一,大二想踏入程序竞赛的同学可以当习题做做,如果您像我一样不是ACMer,平时项目中也很少用DP,同样可以回顾一下DP的奥妙。


1.最大连续子序列之和

给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。

状态转移方程: sum[i]=max(sum[i-1]+a[i],a[i])

代码清单:

#include "stdio.h"

main(){
	int i,sum = 0, max = 0;
	int data[] = {
		1,-2,3,-1,7
	};
	for(i = 0; i < sizeof(data)/sizeof(data[0]); i++){
		sum += data[i];
		if(sum > max)
			max = sum;
		if(sum < 0)
			sum = 0;		
	}
	printf("%d",max);
}

2.数塔问题


数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

转移方程:sum[i] = max(a[左孩子] , a[右孩子]) + a[i]

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值