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

2021-07-09 21:47:51 字數 1782 閱讀 5635

時間限制:

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

**yougth原創

上傳者tc_楊闖亮

思路:資料較小,想到狀態壓縮,110010中的0表示該位置的石子已經合併了。

**:#include #include #include #include #include #include #include #include #include #include #include #include #pragma comment (linker,"/stack:102400000,102400000")

#define pi acos(-1.0)

#define eps 1e-6

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

#define fre(i,a,b) for(i = a; i <= b; i++)

#define free(i,a,b) for(i = a; i >= b; i--)

#define frl(i,a,b) for(i = a; i < b; i++)

#define frll(i,a,b) for(i = a; i > b; i--)

#define mem(t, v) memset ((t) , v, sizeof(t))

#define sf(n) scanf("%d", &n)

#define sff(a,b) scanf("%d %d", &a, &b)

#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)

#define pf printf

#define dbg pf("hi\n")

typedef long long ll;

using namespace std;

#define inf 0x3f3f3f3f

#define mod 1000000009

const int maxn = 1050;

const int maxn = 2005;

const int maxm = 200010;

const int n = 1005;

int dp[maxn],a[12][12];

int n;

int isok(int pre,int now) //判斷下一狀態是否合法

int dfs(int s)

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

if (s==0) return 0;

int ans=0;

for (int i=0;i<(1<

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,但是他想得到最多...

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

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