dp(路徑字典序輸出)

2021-09-25 18:59:56 字數 907 閱讀 6411

今天做了一道01揹包加最小字典序輸出的問題,就稍微總結一下然後說些理解,如果有錯還望大神指出。

題目位址戳這裡

路徑的儲存有兩種方法,一種是用path二維陣列記錄一下路徑,另一種是直接根據dp陣列逆著找回去.

第一種方法:優化後和沒優化的dp陣列都可以使用

第二種方法:只能用於沒有優化後的dp陣列,一維存的資訊不夠.(因為一維邊存邊丟.)

至於要輸出字典序最小的方案,採取貪心的思想,從第乙個物品開始判斷取還是不取,那麼此時在dp的時候我們也要從後往前看每個物品。而要輸出字典序最大的方案那麼就直接從後面向前面看就可以了

for(int i=1;i<=n;i++)  //n個物品,用結構體input儲存}}

int i=n,j=m;

while(i&&j)

i--;

}

方法二

for(int i=1;i<=n;i++)  //n個物品,用結構體input儲存

}int i=n,j=m;

while(i&&j)

i--;

}

//如果要輸出最小字典序

for(

int i=n;i>=

1;i--

)//從最後乙個物品開始拿,此時dp[i][j]表示後n-i+1個物品中體積為j時的最大價值

}//輸出路徑的方案

int i=

1,j=v;

while

(i<=n&&j>0)

//從第乙個物品開始看拿沒拿

//拿了就輸出,再把體積減去,值得注意一下的是邊界條件j>=v[i],如果沒有這個條件的話就會出現陣列下標越界答案出錯。

i++;//判斷下乙個物品

}

字典序輸出

這一類的題目在面試中的演算法是比較常見的,這裡也自己做乙個總結 從陣列的末尾開始,首先找到第乙個公升序的數字對,然後交換這個數字對,然後從這個數字對開始,按照生序交換後面的所有數字。將1 n個整數按字典順序進行排序,返回排序後第m個元素 給定乙個整數n,給定乙個整數m,將1 n個整數按字典順序進行排...

BFS求最短路徑並且輸出最小字典序路徑

題目鏈結 題目很好理解大家自己去看一下就好,大致思路就是bfs求出路徑並且利用陣列記錄一下路徑,b nx ny b x y 1代表 x,y 是 nx,ny 的字首,這個技巧很好用,從乙個大佬那裡學來的 heihei 然後我們需要從終點開始作為bfs的起點,並且記錄路徑,這樣做的目的就是保證了我們記錄...

uva1599 雙向bfs 路徑字典序輸出

題意 紫書上有。思路 首先逆向bfs一遍,求出其他所有點到終點的最短距離。然後正著bfs一遍,每次選擇和當前節點到終點距離少1的點,且更新這一步的所選擇的顏色。這樣列印路徑直接按照步數列印就可以了 其他方式地列印都很麻煩 本題有乙個特別需要注意地地方 字典序最小是整體的,因此不能單單判斷到某個點的顏...