2014.4.11 动态规划

一 数塔问题(双变量)
2084http://acm.hdu.edu.cn/showproblem.php?pid=2084
状态转移方程dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
dp表示当前位置到底部最长的和

#include<stdio.h>
#include<string.h>
#define max(a,b) (a)>(b)?(a):(b)
int main()
{
	int c,n;
	int i,j;
	int a[101][101];
    	int b[101][101];
	scanf("%d",&c);
	while(c--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
			for(j=0;j<=i;j++)
				scanf("%d",&a[i][j]);
			memset(b,0,sizeof(b));
			for(i=n-2;i>=0;i--)
				for(j=0;j<i+1;j++)
					a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
				printf("%d\n",a[0][0]);
	}
	return 0;
}


 

二最长有序子数列(单变量)
a[]为待处理数组dp[]用于记录a[]数组中,以对应位置数据为结尾的最长有序序列长度
以a[i]为结尾,找出在a[i]前比a[i]小的数据中以该数据结尾的最大有序子数列长度max(dp[j]).

三最长公共子序列
1159http://acm.hdu.edu.cn/showproblem.php?pid=1159
dp[i][j]表示两个子序列取到i,j是最长子序列的长度
1.a[i]==b[j] dp[i-1][j-1]+1
2.a[i]!=b[j] max(dp[i-1][j],dp[i][j-1])

四搬寝室
1421http://acm.hdu.edu.cn/showproblem.php?pid=1421


思考:

1.1160 FatMouse's Speed
http://acm.hdu.edu.cn/showproblem.php?pid=1160
体重上升,速度下降的最长子序列

2.1087 Super Jumping! Jumping! Jumping!
http://acm.hdu.edu.cn/showproblem.php?pid=1087

3.1058
http://acm.hdu.edu.cn/showproblem.php?pid=1058
f=min(dp[i]*2,dp[j]*3,dp[k]*5,dp[m]*7)

你可能感兴趣的:(2014.4.11 动态规划)