hdu 2084 數塔 簡單從上往下遞推
#include<cstdio>
#include<cstring>
#include<cstdlib>
/*
1;分解問題:dp[i][j]表示第i行第j列的位置到達底部的最大數字和
2;初始狀態:最下面一行的dp值就是原三角形底對應位置的值
3:狀態轉移方程:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j]
某個位置到底部的最大數字和等於正下位置到底部和又下位置到底部的最大數字中較大的一個加該位置數字。
4:優化,滾動數組,這裏尚不優化
*/
int a[110][110];
int dp[110][110];
int n;
int max1(int a, int b) {
return a > b ? a : b;
}
//建立原數組
void Init()
{
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
scanf("%d", &a[i][j]);
}
}
}
//狀態轉移
void Dp()
{
for (int j = 1; j <= n; j++)dp[n][j] = a[n][j];
for (int i = n; i >= 1; i--) {
for (int j = 1; j <= n; j++) {
dp[i][j] = max1(dp[i + 1][j], dp[i + 1][j + 1]) + a[i][j];
}
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
Init();
Dp();
printf("%d\n", dp[1][1]);
}
}
hdu 2018 母牛的故事 簡單遞推計數
#include<cstdio>
#include<cstring>
#include<cstdlib>
/*
1;分解問題:這題實際上可以說是遞推題,但因爲記憶化了,所以就將它看爲動態規劃題吧。
從樣例可以看出,第二年生的小牛第五年就可以生小牛了,就是說過了三年可以生小牛(因爲出生的時候就0歲時也佔一個年頭)
這題跟斐波拉係數列有點像,實際上斐波拉係數列是由細菌繁殖問題推來的。
你會發現,實際上第5年的小牛等於第4年的小牛加第2年的小牛。爲什麼,因爲在第4年的小牛中:第2年的小牛在第5年一定可以生小牛了,其他的小牛不行。
所以dp[i]第i年的牛數
2;初始狀態:dp[1]=1,dp[2]=2,dp[3]=3;
3:狀態轉移方程:dp[i]=dp[i-1]+dp[i-3];
*/
int dp[60];
//狀態轉移
void Dp()
{
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
for (int i = 4; i < 55; i++)dp[i] = dp[i - 1] + dp[i - 3];
}
int main()
{
Dp();
int n;
while (1) {
scanf("%d", &n);
if (n == 0)break;
printf("%d\n", dp[n]);
}
}