日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数字三角形问题

發布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数字三角形问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 <fstream> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cstring> 6 #include <cmath> 7 #include <cstdlib> 8 #include <queue> 9 10 using namespace std; 11 12 #define PI acos(-1.0) 13 #define EPS 1e-10 14 #define lll __int64 15 #define ll long long 16 #define INF 0x7fffffff 17 18 const int N=100; 19 int a[N][N]; 20 21 int main(){ 22 //freopen("D:\\input.in","r",stdin); 23 //freopen("D:\\output.out","w",stdout); 24 int n; 25 while(~scanf("%d",&n)){ 26 for(int i=0;i<n;i++) 27 for(int j=0;j<=i;j++) 28 scanf("%d",&a[i][j]); 29 for(int i=n-2;i>=0;i--) 30 for(int j=0;j<=i;j++) 31 a[i][j]+=max(a[i+1][j],a[i+1][j+1]); 32 printf("%d\n",a[0][0]); 33 } 34 return 0; 35 } View Code

?

2.數字三角形問題2:

在問題1的基礎上加上一條件:

?某一層可以隨意跳 思路:加一維狀態即可。 解法一: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 #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--) 13 14 int s[102*103/2],dp[102*103/2][2];//dp:從第i點起至最后一層且第i點所在層以后(包括該層)是否跳過的最優值(第二維為1表示已跳過) 15 int n,cnt; 16 17 int main() 18 { 19 //freopen("D:\\input.in","r",stdin); 20 //freopen("D:\\output.out","w",stdout); 21 int t,t2,t3; 22 while(scanf("%d",&n)&&n) 23 { 24 cnt=n*(n+1)/2; 25 rep(i,1,cnt) 26 { 27 scanf("%d",s+i); 28 dp[i][0]=0; 29 dp[i][1]=0; 30 } 31 t=n*(n-1)/2; 32 rep(i,1,n) 33 { 34 t2=t+i; 35 dp[t2][0]=s[t2]; 36 dp[t2][1]=dp[t2][0]; 37 } 38 dep(i,n-1,1) 39 { 40 t=i*(i-1)/2; 41 t2=i*(i+1)/2; 42 t3=0; 43 rep(j,1,i+1) 44 t3=max(t3,dp[t2+j][0]); 45 rep(j,1,i) 46 { 47 dp[t+j][0]=s[t+j]+max(dp[t2+j][0],dp[t2+j+1][0]); 48 dp[t+j][1]=s[t+j]+max(max(dp[t2+j][1],dp[t2+j+1][1]),t3); 49 } 50 } 51 printf("%d\n",max(dp[1][1],dp[1][0])); 52 } 53 return 0; 54 } View Code

解法二:

1 #include <fstream> 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 6 using namespace std; 7 8 #define PI acos(-1.0) 9 #define EPS 1e-6 10 #define lll __int64 11 #define ll long long 12 #define INF 0x7fffffff 13 14 const int N=100; 15 int a[N][N],dp[N][N][2];//第三維若是1,表示此層之下發生過跳躍。 16 17 int main() 18 { 19 //freopen("D:\\input.in","r",stdin); 20 //freopen("D:\\output.out","w",stdout); 21 int n; 22 while(scanf("%d",&n)&&n){ 23 for(int i=1;i<=n;i++){ 24 for(int j=1;j<=i;j++){ 25 scanf("%d",&a[i][j]); 26 } 27 } 28 memset(dp,0,sizeof(dp)); 29 for(int i=1;i<=n;i++) dp[n][i][0]=a[n][i],dp[n][i][1]=a[n][i]; 30 for(int i=n-1;i>0;i--){ 31 int maxn=0; 32 for(int j=1;j<=i+1;j++) 33 if(dp[i+1][j][0]>maxn) maxn=dp[i+1][j][0]; 34 for(int j=1;j<=i;j++){ 35 dp[i][j][0]=a[i][j]+max(dp[i+1][j][0],dp[i+1][j+1][0]); 36 dp[i][j][1]=a[i][j]+max(max(dp[i+1][j][1],dp[i+1][j+1][1]),maxn); 37 } 38 } 39 printf("%d\n",dp[1][1][1]); 40 } 41 return 0; 42 } View Code

樣例:

4
? ? 1
? ?3 2
?4 10 1
4 3 2 20
0

answer:34

?

轉載于:https://www.cnblogs.com/jiu0821/p/4355135.html

總結

以上是生活随笔為你收集整理的数字三角形问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。