codevs3196 黃金寶藏

2022-05-21 06:55:33 字數 1004 閱讀 3301

題目描述 description

小毛終於到達寶藏點,他意外地發現有乙個外星人(名叫pluto)。寶藏是一些太空**,有n堆排成一行,每堆中有xi顆**。小毛和pluto決定輪流從中取出**,規則是每次只能從最左邊或最右邊取出一堆**,直到所有**被取出。小毛先取,兩人都以最優策略進行選取,求兩人的最後所得。

輸入描述 input description

第一行是正數n(≤500);第二行為n個正整數xi(≤300),表示每堆**的個數。

輸出描述 output description

僅兩個整數,分別表示小毛和pluto的得分,以空格隔開。

樣例輸入 sample input

6 4 7 2 9 5 2

樣例輸出 sample output

18 11

題解:設dp[i][j]表示當取到只剩下i~j的元素時的先手的最優得分,這個轉移非常好像,但第一次寫類似博弈的題目,寫詳細一些。

首先我們有兩種決策,對於區間i~j,可以取a[i],也可以取a[j],當我們取a[i]時,對手就還剩下區間i+1~j,那麼此時他就變成了先手,按照最優策略取了dp[i+1][j],如果取a[j],那麼還剩下區間i~j-1,那麼他就會取dp[i][j-1],因為我們兩個人的所取的總和是不變的,都是區間和,那麼我們只有最小化他的取值,才能得到我們想要的最大得分。所以dp[i][i+len]=sum[i+len]-sum[i-1]-min(dp[i+1][i+len],dp[i][i+len-1]),因為我們是在保證後手也是用最優策略的情況下做出的判斷,而轉移也是用最優的轉移,所以符合題意。

**:

#include#include

#include

#include

#include

#define manx 1000

using

namespace

std;

intdp[manx][manx],a[manx],sum[manx];

intn;

intmain()

許可權管理 3 19

1.uid與gid 每乙個登入者至少有兩個id 使用者id uid 群組id gid 2.使用者登入主機做的工作 1 找 etc passwd中是否有帳號,若有則讀出uid,gid,家目錄與shell配置 2 在 etc shadow中找到對應的帳號與uid,核對口令 3 進入shell控管 3.三...

3 19學習筆記

1.字串 str 轉二進位制 bytes 字串轉二進位制 1 將字串資料轉換成二進位制資料 str1 abc b str1 b abc print type str1 type b str1 2 bytes 字串 str2 hello result bytes str2,encoding utf 8...

319 燈泡開關

初始時有 n 個燈泡關閉。第 1 輪,你開啟所有的燈泡。第 2 輪,每兩個燈泡你關閉一次。第 3 輪,每三個燈泡切換一次開關 如果關閉則開啟,如果開啟則關閉 第 i 輪,每 i 個燈泡切換一次開關。對於第 n 輪,你只切換最後乙個燈泡的開關。找出 n 輪後有多少個亮著的燈泡。示例 輸入 3輸出 1解...