P2540 鬥地主增強版

2022-02-14 00:14:15 字數 1407 閱讀 6834

p2540鬥地主增強版

參考大佬題解

思路:順子暴力搜,剩下的牌我不會貪心所以用記憶化搜尋(或者dp);

注意:雙王不能當對,二不算順子

**

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;78

#define res register int

9#define inf 0x3f3f3f3f

10 inline int

read()

1617

intn,t,ans;

18int a[20

];19

int f[25][25][25][25

];20

//單個牌的數目,雙,三,四,王

21int c[5

];22

23 template 24 inline t my_max(t a,t b)

25 template 26 inline t my_min(t a,t b)

2728

int calc(int a,int b,int c,int

d)29

45void dfs(int

x)46

64if(!f) continue;65

for(res j=1 ; j<=cnt ; j++)

66 a[i+j-1]-=k;

67 dfs(x+1

);68

for(res j=1 ; j<=cnt ; j++)

69 a[i+j-1]+=k;

70 cnt++;//

看有沒有更長的順子71}

72}73 c[1]=c[2]=c[3]=c[4]=0;74

for(res i=3 ; i<=15 ; i++) c[a[i]]++;

75if(a[0]==2) ans=my_min(ans,x+calc(c[1],c[2],c[3],c[4])+1

);76

//王炸

77 ans=my_min(ans,x+calc(a[0]+c[1],c[2],c[3],c[4

]));78}

7980

intmain()

8196 dfs(0

);97 printf("

%d\n

",ans);98}

99100

return0;

101 }

view code

luogu2540 鬥地主增強版

給你一副手牌,沒有飛機帶翅膀,按鬥地主的規則,求將所有牌打出的最少次數。我們已經知道花色對牌沒有影響,那麼如果不考慮順子,每個牌具體是什麼數字我們也用不著知道,我們關心的只有牌堆中單張 對子 棒子 炸彈 王的個數。因此我們可以用 f k 1,k 2,k 3,k 4,k x 表示當有 k 1 個單張,...

題解 P2668 鬥地主

思路 dfs 簡易剪枝 簡易a 我也不知道算不算a dfs引數記錄層數 按消耗牌多少的貪心順序搜尋 有幾種情況可以不用搜尋 但我還是搜尋了 可以用a 估算出來 最後剩下有單牌,對子,三張牌,4炸彈的時候可以直接算出來 還有乙個剪枝,乙個簡簡單單的剪枝 if x ans return 這個因為省略了很...

P2668 鬥地主 dp 深搜版

牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃 紅心 梅花 方片的a到k加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼表示如下 3 4 5 6 7 8 9 10現在,牛牛只想知道,對於自己的若干組手牌,分別最少需要多少次出牌可以將它們打光。請你幫他解決這個...