下圖是個數字三角,請編寫乙個程式計算從頂部至底部某處一條路徑,使得該路徑所經過的數字總和最大。
3 88 1 0
2 7 4 4
1. 每一步可沿左斜線向下或右斜線向下走;
2. 1<=三角形行數<=100
3. 三角形中的數字為整數 0,1,……,99。
4. 如果有多種情況結果都最大,任意輸出一種即可。
第一行乙個整數n,代表三角形的行數。
接下來n行,描述了乙個數字三角。
第一行乙個整數,代表路徑所經過底數字總和。
第二行n個數,代表所經過的數字。
4
7 3 8
8 1 0
2 7 4 4
25 7 3 8 7
題目意思很簡單,關鍵是思路。我們從dp角度考慮,可設f[i][j]表示從三角形頂部到第i行第j列這個點所經過數字總和的最大值,那麼答案就是max。易得狀態轉移方程為:
f[i][j]=max+a[i][j](其中初值為f[1][1]=a[1][1]) 當然這裡還要考慮i,j的位置關係的限制導致轉移方程的不同,當(j==1)時,f[i][j]=f[i-1][j]+a[i][j];當(j==i)時,f[i][j]==f[i-1][j-1]+a[i][j]。弄清楚這些就不難解決這個問題了。
#include
#include
using
namespace
std;
const
int maxn=105;
int a[maxn][maxn],f[maxn][maxn];
int ans[maxn],n;//ans陣列用來記錄每一行所經過的那個數
void dp()
}int main()
else
if(f[i][tmp]>f[i][tmp-1]) ans[i]=a[i][tmp];
else
if(f[i][tmp]1])
}printf("%d\n",sum);
printf("%d",ans[1]);
for(int i=2;i<=n;i++) printf(" %d",ans[i]);
printf("\n");
}return
0;}
SCU 1114 數字三角
c 數字三角 time limit 0msmemory limit 0kb64bit io format lld llu submit status practice scu 1114 description 下圖是個數字三角,請編寫乙個程式計算從頂部至底部某處一條路徑,使得該路徑所經過的數字總和最...
SCU 1114 數字三角(dp)
題目思路 戳我戳我 這是一道dp的模板題,狀態轉移方程很容易想,唯一需要注意的就是怎麼把路徑列印出來 因為我們dp的時候其實是在遞迴的,此時我們並不知道選擇了下一層的哪個數字,可以考慮在dp的時候把每一層到底層的最大值儲存在陣列res中,這樣第i層選擇的數字就是res i res i 1 最後列印出...
螺旋列印三角數字矩陣
藍橋杯 程式設計 滿分15分 方陣的主對角線之上稱為 上三角 請你設計乙個用於填充n 階方陣的上三角區域的程式。填充的規則是 使用1,2,3 的自然數列,從左上角開始,按照順時針方向螺旋填充。例如 當n 3 時,輸出 1 2 3 6 4當n 4 時,輸出 1 2 3 4 9 10 5 8 6 當n ...