NYOJ 832 合併遊戲

2022-03-06 01:27:04 字數 1568 閱讀 4196

時間限制:1000 ms  |  記憶體限制:65535 kb

難度:4

描述

大家都知道yougth除了熱愛程式設計之外,他還有乙個愛好就是喜歡玩。某天在河邊玩耍的時候,他發現了一種神奇的石子,當把兩個石子放在一起的時候,後乙個石子會消失,而且會蹦出一定數量的金幣,這可樂壞了yougth,但是他想得到最多的金幣,他該怎麼做?

輸入

首先一行,乙個n(1<=n<=10),表示有n個石子。接下來n*n的乙個矩陣,aij表示第i個和第j個合併蹦出的金幣值(小於10000,注意合併後j會消失)。

輸出

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

樣例輸入

20 4

1 03

0 20 1

12 0 1

1 10 0

樣例輸出422

**

yougth原創

上傳者

tc_楊闖亮

解題:在wdd的指導,終於搞定了!wdd,神dp啊!狀壓dp。。。

二進位制1111表示還剩4個沒有選,二進位制1101表示還剩三個沒選,1101可以由1111與另外三個合併轉移而來。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 

11 #include

12 #include 13

#define ll long long

14#define pii pair15

#define inf 0x3f3f3f3f

16using

namespace

std;

17int mp[12][12

],n;

18 vectorg[100

];19

bool vis[20480

];20

int dp[100000

];21

void

init() 40}

41}42}

43}44int go(int

x)55}56

}57return

themax;58}

59int

main()

67 memset(dp,0,sizeof

(dp));

68for(i = 1; i <= n; i++)72}

73for(ans = i = 0; i < g[n-1].size(); i++)

74 ans = max(ans,dp[g[n-1

][i]]);

75 printf("

%d\n

",ans);76}

77return0;

78 }

view code

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 合併遊戲(dp狀態壓縮)

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

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

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