1.數字三角形問題1:
• 7
• 3 8
• 8 1 0
• 2 7 4 4
•4 5 2 6 5
•從第一層走到最後一層,每次向左下或右下走,求路徑的最大權值和。
思路:
•如果利用轉移方程求解原問題?
•f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]
•1、從上向下轉移,即i從小到大?
•2、從下向上轉移,即i從大到小?
•觀察轉移方程的性質
•因為第i行的解要由第i+1行的解得到,所以必須從下向上轉移!!
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9view code10using
namespace
std;
1112
#define pi acos(-1.0)
13#define eps 1e-10
14#define lll __int64
15#define ll long long
16#define inf 0x7fffffff
1718
const
int n=100;19
inta[n][n];
2021
intmain()
34return0;
35 }
2.數字三角形問題2:
•某一層可以隨意跳
思路:加一維狀態即可。
解法一:
1 #include 2 #include 3view code4using
namespace
std;56
#define pi acos(-1.0)
7#define eps 1e-6
8#define lll __int64
9#define ll long long
10#define inf 0x7fffffff
11#define rep(i,a,b) for(int i=a;i<=b;i++)
12#define dep(i,a,b) for(int i=a;i>=b;i--)
1314
int s[102*103/2],dp[102*103/2][2];//
dp:從第i點起至最後一層且第i點所在層以後(包括該層)是否跳過的最優值(第二維為1表示已跳過)
15int
n,cnt;
1617
intmain()
1831 t=n*(n-1)/2
;32 rep(i,1
,n)33
38 dep(i,n-1,1)39
50}51 printf("
%d\n
",max(dp[1][1],dp[1][0
]));52}
53return0;
54 }
解法二:
1 #include 2 #include 3 #include 4 #include 5view code6using
namespace
std;78
#define pi acos(-1.0)
9#define eps 1e-6
10#define lll __int64
11#define ll long long
12#define inf 0x7fffffff
1314
const
int n=100;15
int a[n][n],dp[n][n][2];//
第三維若是1,表示此層之下發生過跳躍。
1617
intmain()
1827
}28 memset(dp,0,sizeof
(dp));
29for(int i=1;i<=n;i++) dp[n][i][0]=a[n][i],dp[n][i][1]=a[n][i];
30for(int i=n-1;i>0;i--)38}
39 printf("
%d\n
",dp[1][1][1
]);40}41
return0;
42 }
樣例:41
3 24 10 1
4 3 2 20
0answer:34
數字三角形問題
數字三角形問題 標籤 動態規劃 雜談分類 演算法設計 34 5 11 9 8 15 21 13 4 這是乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 200 三角形中的數字為整數0,1,99 輸入格式 第...
數字三角形問題
給定乙個由n行數字組成的數字三角形,設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。0,0 1,0 1,1 2,0 2,1 2,2 3,0 3,1 3,2 3,3 思路 動態規劃 動態方程 sum i,j a i,j max sum i,j 表示從 i,j 出發時能得到...
數字三角形問題
time limit 1000ms memory limit 65536k 給定乙個由n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大值。輸入資料的第...