DFS總結(jié)

公共模版

int maxv=-INF;
//最優(yōu)值設(shè)為全局變量
inline void DFS(int i,int x1,...,int xn)
//i用來(lái)控制層數(shù),作為邊界條件的判斷依據(jù),x1...xn是最優(yōu)化變量或與其相關(guān)的量
{
        .......
}

括號(hào)里面的內(nèi)容視以下三種而定,最后會(huì)給出總結(jié)


1. 每一層必須選一個(gè)

思路:先加上當(dāng)前的值,然后邊界判斷,如果滿足最優(yōu),更新最優(yōu)值,返回程序,執(zhí)行該步驟的下一個(gè)狀態(tài),比如在例題中可以選擇(x+1,y)和(x+1,y+1)就執(zhí)行下一個(gè)狀態(tài)的dfs,之后恢復(fù)原來(lái)的變量值(恢復(fù)到未選擇之前的狀態(tài),因?yàn)檫€有其他的下一個(gè)狀態(tài)要跑)
例題:
從頂層開(kāi)始向下走,每走下一級(jí),可向左下方向或右下方向走。求走到底層后它所經(jīng)過(guò)數(shù)字的總和的最大值。
【輸入格式】
第一個(gè)整數(shù)為n,一下n行為各層的數(shù)字。
【輸出格式】
一個(gè)整數(shù),即最大值。
【輸入樣例 】
5
1
6 3
8 2 6
2 1 6 5
3 2 4 7 6
【輸出樣例】
23
【樣例說(shuō)明】
最大值=1+3+6+6+7=23

void dfs(int i,int j){
    sum+=a[i][j];
    if(i==N)
    {
        if(sum>Max)
        Max=sum;
        return ;
    }
    for(int x=0;x<2;x++){
        dfs(i+1,j+x);
        sum-=a[i+1][j+x];    
}  

2. 任何一步都可選可不選

分析:這一步其實(shí)是上一步的變種,變化在于首先不能從第一步開(kāi)始,因?yàn)榈谝徊绞强梢圆贿x的,其次因?yàn)槊恳徊蕉际强蛇x可不選的,其實(shí)可以看成每一個(gè)的下一步都有兩種狀態(tài)可以轉(zhuǎn)移,一個(gè)是選擇了這種狀態(tài)的,一個(gè)是沒(méi)選的
思路:先進(jìn)行邊界判斷,若比最優(yōu)值還優(yōu)則更新,返回。
dfs(i+1,x1);
dfs(i+1,x1+a
例題:
洛谷P2036(洛谷P2677也很經(jīng)典)

#define N 2000000000
using namespace std;
int minv=N;
int n;
vector<int> acid,sweet;
void dfs(int i,int sum,int mult,int sub)
{
    if(i==n)
    {
        if(sub<minv)
            minv=sub;
        return;
    }
    dfs(i+1,sum+sweet[i+1],mult*acid[i+1],abs(sum+sweet[i+1]-mult*acid[i+1]));
    dfs(i+1,sum,mult,sub);
}
int main()
{
    cin>>n;
    acid.resize(n+1);
    sweet.resize(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>acid[i]>>sweet[i];
    }
    dfs(0,0,1,N);
    cout<<minv<<endl;
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • https://leetcode.com/tag/depth-first-search/ https://leet...
    丁不想被任何狗咬閱讀 399評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,899評(píng)論 0 33
  • 一、 C/C++程序基礎(chǔ) 面試?yán)}1——分析代碼寫(xiě)輸出(一般賦值語(yǔ)句的概念和方法)。 面試?yán)}2—...
    LuckTime閱讀 2,110評(píng)論 2 42
  • 焦點(diǎn)網(wǎng)絡(luò)初級(jí) 程玲玲 鄭州 堅(jiān)持分享第75天 關(guān)于做自己(補(bǔ)充) 選擇自己想要的讓自己舒適的生活方式,但不要失去獨(dú)...
    思小念052閱讀 277評(píng)論 0 0
  • 教育孩子,一直是個(gè)難題。 有的父母會(huì)在小孩上學(xué)后,就把這方面的事情,放到學(xué)校、老師上,而忽略了自己才是孩子最重要的...
    小一哥閱讀 262評(píng)論 0 0

友情鏈接更多精彩內(nèi)容