描述
7
3 8
8 1 0
2 7 4 4
4 5 6 2 5
(圖1)
圖1顯示了一個三角形數。 編寫一個程序,計算最高金額的數字傳遞路線,從頂部開始和結束的地方固定在底座上。 每一步可以走斜向下向左或向右斜下。
輸入
程序從標准輸入讀取。 第一行包含一個整數N:三角形的行數。 以下N行描述三角形的數據。 在三角形的行數> 1但< = 100。 三角形的數量,所有的整數,在0到99之間。
輸出
你的程序是編寫到標准輸出。 最高金額寫成一個整數。
樣例輸入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
樣例輸出
30
我的代碼是:
#include
int main()
{
int a[101][101]={0},n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
a[i][j]+=(a[i][j-1]>a[i-1][j-1]?a[i][j-1]:a[i-1][j-1]);
printf("%d\n",a[n][n]);
return 0;
}
ACM中的數塔問題。最大的數經過動態規劃後應該在最頂層,也就是a[1][1]。
a[i][j]+=(a[i][j-1]>a[i-1][j-1]?a[i][j-1]:a[i-1][j-1]);
/*要改成*/
a[i][j]+=(a[i+1][j]>a[i+1][j+1]?a[i+1][j]:a[i+1][j+1]);
完整的代碼應該是
#include <stdio.h>
#include <string.h>
int a[110][110];
int main()
{
int i,j,n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(i=1; i<=n; i++)
for(j=1; j<=i; j++)
scanf("%d",&a[i][j]);
for(i=n-1; i>=1; i--)
for(j=1; j<=i; j++)
a[i][j]+=(a[i+1][j]>a[i+1][j+1]?a[i+1][j]:a[i+1][j+1]);
printf("%d\n",a[1][1]);
}
return 0;
}