动态规划问题的入门学习

01:数塔问题:

题目描述

考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始到底部任意处结束的路径经过的最大的数字和。每一步可以走到左下方的点也可以到达右下方的点。

        7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 

在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30

输入

第一个行包含 R(1<= R<=1000) ,表示行的数目。 后面每行为这个数字金字塔特定行包含的整数。 所有的被供应的整数是非负的且不大于100。

输出

单独的一行包含那个可能得到的最大的和。

样例输入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出

30

从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。

  同样,下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。

结论:自顶向下的分析,自底向上的计算。

最长公共子序列:

HDOJ-1159:

SampleInput
abcfbcabfcab
programming contest
abcd mnp 

SampleOutput
 4
  2
  0


辅助理解图:




HDU 1058:Humble Numbers

ProblemDescription

Anumber whose only prime factors are 2,3,5 or 7 is called a humble number. Thesequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27,... shows the first 20 humble numbers.

Write a program to find and print the nth element in this sequence 

#include<stdio.h>
int min(int a,int b,int c,int d)
{
	int min1,min2;
	min1=a<b?a:b;
	min2=c<d?c:d;
	min1=min1<min2?min1:min2;
	return min1;
}
int main()
{
	int i,b2,b3,b5,b7,a[5860]={0,1};
	b2=b3=b5=b7=1;i=2;
	while(i<=5842)
	{
		a[i]=min(2*a[b2],3*a[b3],5*a[b5],7*a[b7]);
		if(a[i]==2*a[b2])
			b2++;
		if(a[i]==3*a[b3])
			b3++;
		if(a[i]==5*a[b5])
			b5++;
		if(a[i]==7*a[b7])
			b7++;
		i++;
	}
	int n;
	while(scanf("%d",&n)!=EOF&&n)
	{
		int t;
		t=n%10;
		if(t==1&&n%100!=11)
			printf("The %dst",n);
		else if(t==2&&n%100!=12)
			printf("The %dnd",n);
		else if(t==3&&n%100!=13)
			printf("The %drd",n);
		else
			printf("The %dth",n);
		
		printf(" humble number is %d.\n",a[n]);
	}
    return 0;
}

动态规划打表。

注意打表中的if不能变成else if 如果是公共倍数  那么都要加加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值