數塔路徑 演算法,數塔問題 是怎麼回事

2025-05-28 15:40:08 字數 4039 閱讀 3435

1樓:匿名使用者

help you, help me.

請編一程式,計算從頂至底某處的一條路徑,使該路徑經過的數字總和最大,要求每一步只能沿左斜線或右斜線向下走。(最長路徑問題)

分析:該題相當於路徑的求權問題。分析題此做則意可知,對於三角形中任何乙個不在森棚最底行的結點m[i][j],它的下一步有且只有兩條路徑:

m[i+1][j]與m[i+1][j+1].用乙個陣列last儲存目前已經走過的權重最大的路徑,用max儲存其權值,用陣列path儲存當前剛走過的路徑。這樣,只需從左至右用遞迴的方法遍歷該三角形,最終的last即為所求的路徑。

下面的程式已經編譯通過了,格式有點亂,自己改改囉。

#include

#include

int b[2]=,m;

int path[100],max=0,a[100][100],last[100];

void go1(int i,int j)int y,k,l;

path[i]=a[i][j];

for (k=0;k<2;k++)

y=j+b[k];

if (imax)

max=s;

for(l=0;llast[l]=path[l];

int main()

file *fp;

int i,j;

system("cls");

fp=fopen("","r");假定檔案位置在當前目錄下*/if(fp==null)

printf("不能開啟檔案!")

exit(1);

fscanf(fp,"%d",&m);

for(i=0;ifor(j=0;j<=i;j++)

fscanf(fp,"%d",&a[i][j]);

go1(0,0);

for(i=0;iprintf("%3d ",last[i]);

printf("max=%d",max);

system("pause");

return 0;

2樓:匿名使用者

國語都說不好,真同情你。

數塔問題 是怎麼回事?

3樓:匿名使用者

從頂部出發,在每一結點可以選擇向左走或是向右走,一起走到底層,要求找出一條路徑,使路徑上的值最大。

這道題如果用列舉法,在數塔層數稍大的情況下則需要列舉出的路徑條數將是乙個非常龐大的數目。

如果用貪心法又往往得不到最優解。

在用動態規劃考慮數塔問題時可以自頂向下的分析,自底向上的計算。從頂點出發時到底向左走還是向右走應取決。

於是從左走能取到最大值還是從右走能取到最大值,只要左右兩道路徑上的最大值求出來了才能作出決策。同樣的。

道理下一層的走向又要取決於再下一層上的最大值是否已經求出才能決策。這樣一層一層推下去,直到倒數第二層。

時就非常明瞭。如數字2,只要選擇它下面較大值的結點19前進就可以了。所以實際求解時,可從底層開始,層層。

遞進,最後得到最大值。

實際求解時應掌握其程式設計的一般規律,通常需要哪幾個關鍵陣列來儲存變化過程這一點非常重要。

數塔問題的樣例程式如下:

4樓:匿名使用者

#include

main()

int ttt[n][n]=;輔助矩陣。

int r,c;//r是層,c是列。

for(r=n-2;r>=0;r--)自底向上遞迴計算for(c=0;c<=r;c++)

if( t[r+1][c]>t[r+1][c+1])else

給輔助矩陣最低行賦值。

for(r=n-1,c=0;cfor(r=0,c=0;relse

執行結果:13 8 26 15 24

數塔問題c或c++

5樓:網友

從底層向上考慮 每往上一層 取一次最大值 到最後頂層那個數就是最大值了 在處理的過程中記錄下父節點就可以輸出路徑了。

如果還不懂 再問我吧。

數塔問題貌似有點小問題

6樓:緣明思

我手算結果是30。所以?36怎麼算的?7-3-8-7-5

求教pascal程式設計數塔問題

7樓:騎士

vara:array[1..50,1..50,1..3]of longint;

i,j,n:longint;

beginreadln(n);

for i:=1 to n do for j:=1 to i do begin

read(a[i,j,1]);

a[i,j,2]:=a[i,j,1];

a[i,j,3]:=0;

end;for i:=n-1 downto 1 dofor j:=1 to i do

if a[i+1,j,2]>a[i+1,j+1,2] then begin

a[i,j,2]:=a[i,j,2]+a[i+1,j,2];

a[i,j,3]:=0;

end else begin

a[i,j,2]:=a[i,j,2]+a[i+1,j+1,2];

a[i,j,3]:=1;

end;writeln(a[1,1,2]);

j:=1;for i:=1 to n-1 do beginwrite(a[i,j,1],'->');

j:=j+a[i,j,3];

end;writeln(a[n,j,1]);

end.lz動規解這題是最好的方法,貪心只能弄20分,暴力10分。

8樓:匿名使用者

簡單- -資料範圍相當小,直接搜尋加個高精運算(高精除法要用二分+高精乘法)就能過,**應該相當長(畢竟4個高精函式). 搜尋過程很簡單 : 直接列舉運算子(0~2個),然後在其中填上x,y,看是否符合條件(必須所有數都符合),符合就開始向上計算傳遞(高精運算),然後記錄或者回溯輸出即可。。

9樓:匿名使用者

你確定你是給人做的題目 我估計也沒幾個人看懂。

數塔 acm 的問題 最好給出c++的**

10樓:網友

直接記事本打了 有錯告訴一聲。

#include

#define maxn 100

using namespace std;

int max(int a,int b)

int main()

數塔 pascal

11樓:騎士

dp直接秒過……含路徑哦!

vara:array[1..50,1..50,1..3]of longint;

i,j,n:longint;

beginreadln(n);

for i:=1 to n do for j:=1 to i do begin

read(a[i,j,1]);

a[i,j,2]:=a[i,j,1];

a[i,j,3]:=0;

end;for i:=n-1 downto 1 dofor j:=1 to i do

if a[i+1,j,2]>a[i+1,j+1,2] then begin

a[i,j,2]:=a[i,j,2]+a[i+1,j,2];

a[i,j,3]:=0;

end else begin

a[i,j,2]:=a[i,j,2]+a[i+1,j+1,2];

a[i,j,3]:=1;

end;writeln(a[1,1,2]);

j:=1;for i:=1 to n-1 do beginwrite(a[i,j,1],'->');

j:=j+a[i,j,3];

end;writeln(a[n,j,1]);

end.

12樓:網友

暴力列舉每層向左還是向右 o(n*2^n)不會超時。

可以用遞推實現。

樓上未考慮負數吧。

word老是出問題是怎麼回事

什麼問題?麻煩說清楚一點,以下給你解決方法 找到該檔案所在的路徑。在word中選擇選單 工具 選項 檔案位置 然後雙擊 使用者模板 彈出乙個 修改位置 對話方塊,從中改灶歷就可以找到辯伍檔案的路徑,例如 c documents and settings administrator application...

聽力問題是怎麼回事呢,聽力問題怎麼辦?

首先,我們要知道人是怎樣聽到聲音的,我們的耳朵分為三個部分,有外耳中耳和內耳,通過層層傳遞,外面的聲音資訊才能抵達我們的中樞聽覺系統,這樣我們就可以聽到別人在說什麼。實際上,我們聽聲音不是隻靠耳朵做到的,還要靠著大腦皮層,大腦皮層中有一部分叫聽覺皮層來幫我們感知或者認知語言。所以,在整個聽覺的傳導系...

伊朗核問題是怎麼回事?伊朗不可以發展民用核能嗎?

國際原子能組織的公約任何乙個獨立的主權國家都有和平利用核能的權利。根據這點伊朗是可以發展民用核能的。但是還有一條是核不擴散條款。就是每乙個有核國家要保證其核技術不隨意洩露,中國 美國 法國等,都簽定了這個條款的。同時要求無核國家不再發展核 日本 印度等都是承認這一條款的。伊朗是核不擴散條約的簽定國之...