Vijos 1006
有一個數字三角形,共nn行,依次編號為第一行,第二行至第nn行。其中第ii行有ii個數字,位置依次記為(i,1),(i,2)(i,1),(i,2)到(i,i)(i,i)。
現在從第nn層的第一個位置出發(即(n,1)(n,1)),每一步移到相鄰的,且行編號小于或等于當前行編號的一個位置中,直到(1,1)(1,1)結束,在不重復經過任何位置的情形下,路過的所有位置(包括端點)的對應數字之和最小。
下面詳細定義相鄰關系。
同一層內連續的兩個位置相鄰,特別的有每一層第一個位置與最后一個位置相鄰。
對于位置(i,j)(i,j),它與(i-1,j-1)(i?1,j?1)以及(i-1,j)(i?1,j)相鄰,特別的(i,1)(i,1)與(i-1,i-1)(i?1,i?1)相鄰,且(i,i)(i,i)與(i-1,1)(i?1,1)相鄰。
格式
輸入格式
第一行有一個數n(2<=n<=1000),表示山的高度。
從第二行至第n+1行,第i+1行有i個數,每個數表示晴天小豬在這一段山路上需要爬的時間。
輸出格式
一個數,即晴天小豬所需要的最短時間。
樣例1
樣例輸入1
5 1 2 3 4 5 6 10 1 7 8 1 1 4 5 6 Copy樣例輸出1
10 Copy限制
各個測試點1s
提示
在山的兩側的走法略有特殊,請自己模擬一下,開始我自己都弄錯了……
思路:
輸入的是一個n行,第i行有i個數的數字三角形。個人比較喜歡舉個具體的例子進行分析。如下:
1
2? ? 3
4? ?5? ?6
7? ?8? ?9? ?10
11? ?12? ?13? ?14? ?15
為一個5行的數字三角形。
其可能行走的路線是,向左,向右,斜向上,斜向下,而特殊點(即邊界點)對應的斜上方可以到上一行的另一邊。
例如:5可以到4,6,2,3;11可以到12,15,7,10;
一般化則為a[i][j]可以向a[i][j-1],a[i][j+1],a[i-1][j-1],a[i-1][j]位置走。
臨界處:a[i][1]可以向a[i][2],a[i][i],a[i-1][1],a[i-1][i-1]位置走;a[i][i]同理。
我們從上往下推,如果走到a[i][j]此時是最短的,那么之前的路程都是最短的。
所以我們可以以頂點為起點,計算到達底部各點的最短距離。
#include <iostream>using namespace std;int main() {int num;cin>>num;int ang[num+1][num+1];int f[num+1][num+1];for(int i=1;i<=num;i++)for(int j=1;j<=i;j++)cin>>ang[i][j];f[1][1]=ang[1][1]; //以此為起點for(int i=2;i<=num;i++){for(int j=2;j<i;j++)f[i][j]=min(f[i-1][j-1],f[i-1][j])+ang[i][j]; //計算上一層到這一層的最短距離f[i][1]=min(f[i-1][i-1],f[i-1][1])+ang[i][1]; f[i][i]=min(f[i-1][i-1],f[i-1][1])+ang[i][i]; //剔除特別點for(int j=2;j<=i;j++)f[i][j]=min(f[i][j],f[i][j-1]+ang[i][j]); //從左到右計算同一層最短距離f[i][1]=min(f[i][1],f[i][i]+ang[i][1]);for(int j=i-1;j>=1;j--)f[i][j]=min(f[i][j],f[i][j+1]+ang[i][j]);f[i][i]=min(f[i][i],f[i][1]+ang[i][i]); //從右到左計算同一層最短距離}cout<<f[num][1];return 0; }總結
以上是生活随笔為你收集整理的Vijos 1006的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spss使用教程
- 下一篇: CentOS 安装 Nexus 3