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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU---2084树塔

發布時間:2023/12/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU---2084树塔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


問題分析:

? ? 1.數據存儲:二維數組data[maxn][maxn]存儲樹塔數據,dp[maxn][maxn]用來存儲從某點出發的各個路徑中的最優值

? ? 2.分析思路:樹塔樹塔問題自頂向下分析,自底向上計算。首先對倒數第二層的數據按照自頂向下的分析方法,兩兩結合選出最優解,然后再自頂向上逐層決策,然后逐層遞推求出最終結果。

? ? 得出動態方程:dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + data[i][j],最后的結果保存在dp[0][0]中。?
對于上面的數塔,我們的data數組如下:(圖轉自?https://blog.csdn.net/T_27080901/article/details/45801201

? ?


? ? dp數組狀態如下:

? ? ? ?

不考慮路徑輸出源碼如下:

#include<iostream> #include<algorithm> using namespace std;const int maxn = 101; int n; int data[maxn][maxn]; int dp[maxn][maxn];int main() {int kase,i,j;cin>>kase;while(kase--){cin>>n;for(i=0;i<n;i++){for(j=0;j<=i;j++){cin>>data[i][j];if(i==n-1)dp[i][j]=data[i][j]; }}for(i=n-2;i>=0;i--)for(j=0;j<=i;j++) //j的限制出錯(不是j<i,而是j<=i),導致輸出dp[0][0]為0 //dp[i][j] = dp[i+1][j]+dp[i+1][j+1]; //最初無腦寫的動態方程dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+data[i][j];cout<<dp[0][0]<<endl;}return 0; }

? ? 3.(額外考慮下)路徑輸出

? ? ?1.利用遞歸函數打印

void print_ans(int i,int j) {cout<<data[i][j];if(i<n-1) cout<<"-->";if((dp[i][j]-data[i][j])==dp[i+1][j+1]) j++;if(i>=n-1) return;print_ans(i+1,j); }

? ? ?2.邊自底向上計算邊記錄所做的決策

#include<iostream> #include<algorithm> using namespace std;const int maxn = 101; int data[maxn][maxn]; int dp[maxn][maxn]; int path[maxn][maxn]; //初始化為0,0表示往左走,1表示往右走; //int p[maxn]; //記錄第i層的決策//后來發現這個記錄方法不行, 因為p會被覆蓋 int main() {int kase,n,i,j;cin>>kase;while(kase--){cin>>n;for(i=0;i<n;i++){for(j=0;j<=i;j++){cin>>data[i][j];if(i==n-1)dp[i][j]=data[i][j]; }}for(i=n-2;i>=0;i--)for(j=0;j<=i;j++) if(dp[i+1][j]>dp[i+1][j+1]) //詳細的決策步驟,邊決策計算,邊記錄路徑{dp[i][j] = dp[i+1][j]+data[i][j];//p[i]=j;}else{dp[i][j] = dp[i+1][j+1]+data[i][j];path[i][j]=1;//p[i]=j+1;}cout<<dp[0][0]<<endl;j=0;for(i=0;i<=n-1;i++){cout<<data[i][j];j = j+path[i][j];if(i<n-1) cout<<"-->"; }/*for(i=0;i<=n-1;i++){cout<<data[i][p[i]];if(i<n-1) cout<<"-->"; }*/}return 0; }

運行結果:



總結

以上是生活随笔為你收集整理的HDU---2084树塔的全部內容,希望文章能夠幫你解決所遇到的問題。

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