一 数塔问题(双变量)
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)