国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動態(tài)規(guī)劃入門(數字三角形模型)

這篇具有很好參考價值的文章主要介紹了動態(tài)規(guī)劃入門(數字三角形模型)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

備戰(zhàn)2024年藍橋杯&算法學習 -- 每日一題
Python大學A組

????????試題一:摘花生
????????試題二:最低通行費用
????????試題三:方格取數
????????試題四:傳紙條


試題一:摘花生

【題目描述】

????????Hello Kitty想摘點花生送給她喜歡的米老鼠。她來到一片有網格狀道路的矩形花生地(如下圖),從西北角進去,東南角出來。地里每個道路的交叉點上都有種著一株花生苗,上面有若干顆花生,經過一株花生苗就能摘走該它上面所有的花生。Hello Kitty只能向東或向南走,不能向西或向北走。問Hello Kitty最多能夠摘到多少顆花生。

動態(tài)規(guī)劃入門(數字三角形模型),藍橋杯,人工智能,python,算法

【輸入格式】

????????第一行是一個整數T,代表一共有多少組數據。

????????接下來是T組數據。

????????每組數據的第一行是兩個整數,分別代表花生苗的行數R和列數 C。

????????每組數據的接下來R行數據,從北向南依次描述每行花生苗的情況。每行數據有C個整數,按從西向東的順序描述了該行每株花生苗上的花生數目M。

【輸出格式】

????????對每組輸入數據,輸出一行,內容為Hello Kitty能摘到得最多的花生顆數。

【數據范圍】

????????1≤T≤100,
????????1≤R,C≤100,
????????0≤M≤1000

【輸入樣例】

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

【輸出樣例】

8
16

【解題思路】

? ? ? ? 線性DP中的數字三角形模型,基礎模型,狀態(tài)轉移方程f[i][j] = max(f[i-1][j] , f[i][j-1]) + w[i][j]。

【Python程序代碼】文章來源地址http://www.zghlxwxcb.cn/news/detail-850747.html

T = int(input())
for _ in range(T):
    r,c = map(int,input().split())
    a = [[0]*(c+5)]
    for i in range(r):
        a.append([0]+list(map(int,input().split())))
    f = [[0]*(c+5) for _ in range(r+5)]
    for i in range(1,r+1):
        for j in range(1,c+1):
            f[i][j] = max(f[i-1][j],f[i][j-1])+a[i][j]
    print(f[r][c])

試題二:最低通行費用

【題目描述】

????????本題大意上給定一個 n×n的矩陣,讓我們從左上角出發(fā),最終走到右下角走過的方塊數量的不能超過 2n?1個求所有路線中,經過的方塊的總價值最少的路線。

【解題思路】

? ? ? ? 和上一題相比改了一些條件,比如增加了一個不能超過2n-1個方塊,考慮一下(1,1)到(n,n)的曼哈頓距離發(fā)現d = 2*n-2,同時題目要求的是求總價值最小,在2*n-2的最短路徑上加上一個方塊一定會大于等于這2*n-2個方塊的價值,所以本題可以套上面題目的板子。

【Python程序代碼】

n = int(input())
f = [[1e9]*(n+5) for _ in range(n+5)]
a = [[0]*(n+5)]
for i in range(n):
    a.append([0]+list(map(int,input().split())))
f[0][1]=f[1][0]=0
for i in range(1,n+1):
    for j in range(1,n+1):
        f[i][j] = min(f[i][j-1],f[i-1][j])+a[i][j]
print(f[n][n])

試題三:方格取數

【題目描述】

????????設有N×N?的方格圖(N≤9),我們將其中的某些方格中填入正整數,而其他的方格中則放入數字?0。如下圖所示(見樣例):

動態(tài)規(guī)劃入門(數字三角形模型),藍橋杯,人工智能,python,算法

?????????某人從圖的左上角的?A?點出發(fā),可以向下行走,也可以向右走,直到到達右下角的?B?點。在走過的路上,他可以取走方格中的數(取走后的方格中將變?yōu)閿底?0)。
????????此人從?A?點到?B?點共走兩次,試找出?2?條這樣的路徑,使得取得的數之和為最大。

【輸入數據】

????????輸入的第一行為一個整數?N(表示 N×N?的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的?0?表示輸入結束。

【輸出數據】

????????只需輸出一個整數,表示?2?條路徑上取得的最大的和。

【輸入樣例】

8
2 3 13
2 6  6
3 5  7
4 4 14
5 2 21
5 6  4
6 3 15
7 2 14
0 0  0

【輸出樣例】

67

【解題思路】

? ? ? ? 需要考慮兩條路徑,如何考慮更好呢?如果說分別考慮的話如何判斷是否重合呢且這兩者相加也不一定是最大值,所以如果能夠同時考慮兩條路就好了,首先兩條路的曼哈頓距離一定是相等的,所以我們可以考慮枚舉每一條路徑走的行的數量,列的數量可以用曼哈頓距離-列的數量,所以f[k][i][j]表示曼哈頓距離為k,且第一條路徑走了i行k-i列,第二條路徑走了j行k-j列,那么如何考慮狀態(tài)轉移呢?每一個f[k][i][j]可以由第一條路徑往右走或者往下走過來,也即使f[k-1][i][j]和f[k-1][i-1][j],第二條路徑也是往右或往下,f[k-1][i][j],f[k-1][i][j-1],那也就是四種狀態(tài):f[k-1][i-1][j-1]、f[k-1][i][j-1]、f[k-1][i-1][j]、f[k-1][i][j]。

【Python程序代碼】

n = int(input())
w = [[0]*(n+5) for _ in range(n+5)]
a,b,c = map(int,input().split())
while not (a==0 and b==0 and c==0):
    w[a][b] += c
    a, b, c = map(int, input().split())
f = [[[0]*(n+5) for _ in range(n+5)] for i in range(2*n+5)]
for k in range(2,2*n+1):
    for i in range(1,n+1):
        for j in range(1,n+1):
            if k-i<=0 or k-j<=0 or k-i>n or k-j>n:continue
            v = w[i][k-i]
            t = f[k][i][j]
            if i!=j:v+=w[j][k-j]
            t = max(t, f[k-1][i-1][j-1])
            t = max(t, f[k-1][i][j-1])
            t = max(t, f[k-1][i-1][j])
            t = max(t, f[k-1][i][j])
            f[k][i][j] = t+v
print(f[2*n][n][n])

試題四:傳紙條

【題目描述】

????????小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排坐成一個?m 行?n 列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同學傳到對方手里,小淵坐在矩陣的左上角,坐標?(1,1),小軒坐在矩陣的右下角,坐標?(m,n)。從小淵傳到小軒的紙條只可以向下或者向右傳遞,從小軒傳給小淵的紙條只可以向上或者向左傳遞。?在活動進行中,小淵希望給小軒傳遞一張紙條,同時希望小軒給他回復。班里每個同學都可以幫他們傳遞,但只會幫他們一次,也就是說如果此人在小淵遞給小軒紙條的時候幫忙,那么在小軒遞給小淵的時候就不會再幫忙,反之亦然。?還有一件事情需要注意,全班每個同學愿意幫忙的好感度有高有低(注意:小淵和小軒的好心程度沒有定義,輸入時用?0?表示),可以用一個?0~100的自然數來表示,數越大表示越好心。小淵和小軒希望盡可能找好心程度高的同學來幫忙傳紙條,即找到來回兩條傳遞路徑,使得這兩條路徑上同學的好心程度之和最大?,F在,請你幫助小淵和小軒找到這樣的兩條路徑。

【輸入格式】

????????第一行有?2?個用空格隔開的整數?m?和?n,表示學生矩陣有?m?行?n?列。

????????接下來的?m?行是一個?m×n 的矩陣,矩陣中第?i 行?j 列的整數表示坐在第?i 行?j 列的學生的好心程度,每行的?n 個整數之間用空格隔開。

【輸出格式】

????????輸出一個整數,表示來回兩條路上參與傳遞紙條的學生的好心程度之和的最大值。

?【數據范圍】

????????1≤n,m≤50

【輸入樣例】

3 3
0 3 9
2 8 5
5 7 0

【輸出樣例】

34

【解題思路】

? ? ? ? 和上面一題類似,多了一個路徑不可重復,考慮一下用上面的方法做一下得到兩條路徑,如果路徑沒有交叉和重疊點那么上面的就是答案。如果有交叉呢。

動態(tài)規(guī)劃入門(數字三角形模型),藍橋杯,人工智能,python,算法

????????對于有交叉的我們可以通過移動變到沒有交叉但是個別點重合。對于重復,我們必然可以在兩條路線中找到額外的一條或兩條路線,使得新的路線不發(fā)生重合。如下圖:

動態(tài)規(guī)劃入門(數字三角形模型),藍橋杯,人工智能,python,算法

????????由于原路線是最優(yōu)解,則必然 wA=wB=0,否則最優(yōu)解路徑必然是經過A或B的,因此,我們可以通過微調其中的一條路線,使之不經過重合點 C,同時路線的總價值沒有減少。所以可以直接用方格取數的方法。

【Python程序代碼】

n,m = map(int,input().split())
a = [[0]*(m+5)]
for i in range(n):
    a.append([0]+list(map(int,input().split())))
f = [[[0]*(n+5) for i in range(n+5)] for j in range(n+m+5)]
for k in range(2,n+m+1):
    for i in range(1,n+1):
        for j in range(1,n+1):
            if k-i>m or k-i<=0 or k-j>m or k-j<=0:continue
            t = f[k][i][j]
            v = a[i][k-i]
            if i!=j:v+=a[j][k-j]
            t = max(t, f[k-1][i-1][j-1])
            t = max(t, f[k-1][i-1][j])
            t = max(t, f[k-1][i][j-1])
            t = max(t, f[k-1][i][j])
            f[k][i][j] = t+v
print(f[n+m][n][n])

到了這里,關于動態(tài)規(guī)劃入門(數字三角形模型)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 算法分析與設計-數字三角形問題(動態(tài)規(guī)劃)(通俗易懂,附源碼和圖解,含時間復雜度分析)(c++)

    算法分析與設計-數字三角形問題(動態(tài)規(guī)劃)(通俗易懂,附源碼和圖解,含時間復雜度分析)(c++)

    (一)題目 問題描述 給定一個由 n n n 行數字組成的數字三角形,如圖所示。 試設計一個算法,計算從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。 算法設計 對于給定的由 n n n 行數字組成的數字三角形,計算從該三角形的頂至底的路徑經過的數字和的最大值

    2023年04月10日
    瀏覽(29)
  • 數字三角形+包子湊數(藍橋杯JAVA解法)

    數字三角形+包子湊數(藍橋杯JAVA解法)

    題目描述 上圖給出了一個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對于每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和(路徑上的每一步只可沿左斜線向下或右斜線向下走)。 輸入描述 輸入的第一行包含一個整數?N?(1≤N≤

    2024年02月01日
    瀏覽(18)
  • 藍橋杯第十一屆省賽——數字三角形(python組)

    藍橋杯第十一屆省賽——數字三角形(python組)

    題目:數字三角形 【問題描述】: 上圖給出了一個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對于每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最 大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右 邊

    2023年04月10日
    瀏覽(24)
  • 力扣120. 三角形最小路徑和(Java 動態(tài)規(guī)劃)

    力扣120. 三角形最小路徑和(Java 動態(tài)規(guī)劃)

    Problem: 120. 三角形最小路徑和 Problem:64. 最小路徑和 本題目可以看作是在上述題目的基礎上改編而來,具體的思路: 1.記錄一個int類型的大小的 n 乘 n n乘n n 乘 n 的數組(其中 n n n 為數組triangle的行數)用于記錄 每一個當前階段的最小路徑和 2.大體上可以依據題意得出動態(tài)轉移

    2024年01月22日
    瀏覽(19)
  • 藍橋杯真題——三角形的面積

    題目描述 平面直角坐標系中有一個三角形, 請你求出它的面積。 輸入描述 第一行輸入一個?T?,代表測試數據量. 每組測試數據輸入有三行,每行一個實數坐標?(x,y)?代表三角形三個頂點。 1≤T≤10^3,? ??10^5≤x,y≤10^5 輸出描述 輸出一個實數表示三角形面積。結果保留2位小

    2023年04月11日
    瀏覽(14)
  • 藍橋杯官網填空題(三角形的面積)

    藍橋杯官網填空題(三角形的面積)

    題目描述 本題為填空題,只需要算出結果后,在代碼中使用輸出語句將所填結果輸出即可。 已知三角形三個頂點在直角坐標系下的坐標分別為: ```txt (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) ```txt 求該三角形的面積。 注意,要提交的是一個小數形式表示的浮點數。 要求精確到小數后?3?位

    2024年02月09日
    瀏覽(20)
  • 【數字三角形】

    【數字三角形】

    題目描述 上圖給出了一個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對于每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右 邊的那個數。此外,向左下走

    2024年02月05日
    瀏覽(23)
  • 【數字三角形】(C++版)

    【數字三角形】(C++版)

    題目描述 上圖給出了一個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對于每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右 邊的那個數。此外,向左下走

    2024年02月16日
    瀏覽(32)
  • 藍橋 卷“兔”來襲編程競賽專場-03破解三角形密碼 題解

    挑戰(zhàn)介紹 三角形密碼指的是將一串字符串按照正直角三角形的形狀排列,傳遞的信息隱藏在每一行的最后一個字符,然后將所有的行的最后一個字符依次連接,就是需要傳遞的信息。 例如加密后的字符串是:我們愛的是藍色的心橋 將加密字符串按照正直角三角形填充后如下

    2023年04月16日
    瀏覽(19)
  • AcWing 898. 數字三角形 (每日一題)

    AcWing 898. 數字三角形 (每日一題)

    像數組下標 出現 i-1 的,在循環(huán)的時候從 i=1 開始。 0x3f3f3f3f : 1061109567 Integer.MAX_VALUE : 2147483647 在選用 Integer.MAX_VALUE 時,很可能會出現 數據溢出 。 所以在用 Integer.MAX_VALUE 時 需要先取 MAX 再加 a[i][j]; 注:做 數字三角形 這題時, 初始化時需要注意一下邊界 。 由于我們 狀態(tài)計

    2024年02月11日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包