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 如果是公共倍数 那么都要加加。