快手2020 石頭碰撞 (01揹包)

2021-10-23 04:57:53 字數 861 閱讀 8700

題目大意:

有n(n<=100)個石頭,每次我們可以選擇2個石頭讓其碰撞,產生的新石頭的重量為abs(x-y),其中x,y為原來的兩個石頭的重量,問我們怎麼選取石頭才能讓最後的石頭重量最輕。石頭重量和<= 1e5

解題思路:

顯然,這題需要dp來解決,但是我們乍看之下很難確定這個dp的狀態,題目其實資料範圍給了一定的提示,我們的狀態最好設定為這樣dp[n][weight],n是個數,weight是重量。同時,我們這裡有乙個重要的發現,最後的石頭可以看作是由兩堆石頭的重量差決定的。因為它們的石頭碰撞的過程,無非就是相當於給每個石頭前面加乙個正負號。然後讓我們計算最後的和。到這裡,我們就明白了,其實我們只需要用dp維護其中乙個堆的重量即可(另乙個堆的重量可以由重量和減去本個堆的重量得到),看這個堆的重量是否可行。

dp[n][weight]表示第n個石頭重量為weight是否可行

其中的arr代表原來的石頭重量的陣列。另外,由於這題記憶體比較小,保險起見還是用滾動陣列。

這題通過數**算轉化為01揹包,我覺得是很巧妙的思想。

#includeconst int maxn=1e5+10;

using namespace std;

int main()

vector> dp(2,vector(maxn,0));

int cur=0;

dp[cur][0]=1;

for(int i=0;i=arrmv[i])dp[cur][j]|=dp[!cur][j-arrmv[i]];

}// cerr<

}int ans=1e9;

for(int i=0;i

cout<

return 0;

}

2973 石頭遊戲

給出乙個方格陣,初始每個格仔中都沒有石頭,然後每個格仔都有乙個操作序列,並且每時刻執行乙個,迴圈執行,序列長度小於等於6,問t時刻後石頭個數最多的格仔中有幾個石頭。因為操作序列長度小於等於6,所以每60次操作必有一次迴圈,所以可以對60次操作建乙個矩陣,由60次操作相乘,矩陣的長寬均為方格矩陣的元素...

877 石頭遊戲

亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子piles i 遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。亞歷克斯和李輪流進行,亞歷克斯先開始。每回合,玩家從行的開始或結束處取走整堆石頭。這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲...

04 石頭剪子布

原題鏈結 總時間限制 1000ms 記憶體限制 65536kb 描述 石頭剪子布,是一種猜拳遊戲。起源於中國,然後傳到日本 朝鮮等地,隨著亞歐 的不斷發展它傳到了歐洲,到了近現代逐漸風靡世界。簡單明瞭的規則,使得石頭剪子布沒有任何規則漏洞可鑽,單次玩法比拼運氣,多回合玩法比拼心理博弈,使得石頭剪子布...