NYOJ 832 合併遊戲(dp狀態壓縮)

2021-07-11 12:59:10 字數 936 閱讀 7997

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

大家都知道yougth除了熱愛程式設計之外,他還有乙個愛好就是喜歡玩。

某天在河邊玩耍的時候,他發現了一種神奇的石子,當把兩個石子放在一起的時候,後乙個石子會消失,而且會蹦出一定數量的金幣,這可樂壞了yougth,但是他想得到最多的金幣,他該怎麼做?

輸入

首先一行,乙個n(1<=n<=10),表示有n個石子。

接下來n*n的乙個矩陣,aij表示第i個和第j個合併蹦出的金幣值(小於10000,注意合併後j會消失)。

輸出輸出最多能得到的金幣值。

樣例輸入

2

0 41 0

30 20 1

12 0 1

1 10 0

樣例輸出

4

22

//借鑑了大神部落格裡的分析也說了一下自己的理解,用二進位制數來記錄當前的合併狀態,如4個石子,用1110來表示當前的合併狀態,1表示尚未合併,0表示已經合併消失了,則共有2^4個狀態,如3表示0011,5表示0101,0~2^4之間的每乙個數代表著一種合併狀態;並用陣列的d[x]記錄合併到x狀態時所獲得的最大金幣數,如:d[13]=d[1101]表示合併3後的最大金幣數;

#include#includeint max(int a,int b)

int dp[1100];//記錄當前合併狀態最大金幣數

int a[11][11];

int n;

int ***(int x){

if(dp[x]!=-1) return dp[x];

if(x==0)return 0;

int temp,max;

int s=0;

for(int i=0;i

nyoj832 合併遊戲 狀態dp

狀態壓縮dp。如果要把 第j個元素合併掉。可選擇 a i j i 0 n 1 選擇之後第 j 行第 j 列就不能再被選擇。即指向j的邊和j指向其他元素的邊不能再用 include include define maxsize 12 define findmax a,b a b?a b int v m...

NYOJ 832 合併遊戲

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 大家都知道yougth除了熱愛程式設計之外,他還有乙個愛好就是喜歡玩。某天在河邊玩耍的時候,他發現了一種神奇的石子,當把兩個石子放在一起的時候,後乙個石子會消失,而且會蹦出一定數量的金幣,這可樂壞了yougth,但是他想得到最多...

NYOJ832 合併遊戲 狀壓DP 記憶化搜尋

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 大家都知道yougth除了熱愛程式設計之外,他還有乙個愛好就是喜歡玩。某天在河邊玩耍的時候,他發現了一種神奇的石子,當把兩個石子放在一起的時候,後乙個石子會消失,而且會蹦出一定數量的金幣,這可樂壞了yougth,但是他想得到最多...