演算法:hdu 4597 Play Game(區間dp)

來源:互聯網
上載者:User

題意

Alice和Bob玩一個遊戲,有兩個長度為N的正整數數字序列,每次他們兩個

只能從其中一個序 列,選擇兩端中的一個拿走。他們都希望可以拿到盡量大

的數字之和,並且他們都足夠聰明,每次都選擇 最優策略。Alice先選擇,問

最終Alice拿到的數字總和是多少?

思路

這題應該算是區間dp吧, 可以看一下這題的原型:

其他規則都一樣,但是只有一個數字序列,也是每次只能拿左右兩端的一個數字 ,問最終Alice拿多少? (這個可以去做uva-10891)

只有一行數字序列可以用f(i, j)表示數字序列還剩下 區間[i,j]段時開始拿,最多可以拿多少數字

而這題只是變成了兩行數字序列, 那麼可以在上面的基 礎上,再增加兩維

變成f(i, j, k, l), 表示第一個序列剩下區間[i,j],第二個序列剩下區間[k,l]的情 況下開始拿,最多可以拿多少?

當面臨狀態f(i, j, k, l) 時,你有四種選擇:

1. 選擇第一行的最左 邊數字

2. 選擇第一行的最右邊數字

3. 選擇第二行的最左邊數字

4. 選擇第二行的最右邊數字

所 以, f(i, j, k, l)可以由:

f(i+1, j, k, l)

f(i, j-1, k, l)

f(i, j, k+1, l)

f(i, j, k, l-1)

這四種狀態轉移而來,

假設目前狀態是Alice要選擇,那麼上一個狀態就是Bob選擇的最大值,

為了要讓Alice的最終和最大,那麼就要選擇上面四種狀態最小的一個轉,

設sum(i, j, k, l) 表示地一 個序列[i,j]段之和與第二個序列的[k,l]段之和的和。

sum(i, j, k, l)  - 上一次Bob拿的值 就等於Alice能拿到的值

f(i, j, k, l) = sum(i, j, k, l) -

min{

f(i+1, j, k, l)

f(i, j-1, k, l)

f(i, j, k+1, l)

f(i, j, k, l-1)

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.