程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> printf-c語言的一道題 動態規劃 新手,求大神看看我代碼的問題

printf-c語言的一道題 動態規劃 新手,求大神看看我代碼的問題

編輯:編程解疑
c語言的一道題 動態規劃 新手,求大神看看我代碼的問題

描述
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;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved