NOIP 2015 提高组 Day1 斗地主

为什么网上有这么多的DFS

最少需要多少次出牌,最少,就意味着宽度搜索啊。  我来试一下宽度艘多。若果能我彻底领悟A*算法。我也想用A*算法试一下。


今天突然有了灵感: 跟上次的愤怒的小鸟有什么区别呢? 如出一辙啊。 状态规划+ 状态压缩。

状态怎么压缩,初步的想法是longlong s  。

64位, 一共54张牌,完全可以状态压缩。(int 32位 Long LongLong 64位,  )

五进制数,3位 ,14种牌, 需要42位,  2的42次方,超过已经超过1G了;这里被卡住了!!怎么办??

三个数组

关于状态压缩:参见:https://wenku.baidu.com/view/a7b4c4f35727a5e9846a61c0.html

预先处理下 :将能够一起出的 dp[ s | s ']  = max{   dp[s|s']  ,   dp[s] + s }

f[s]: 记录各种出牌的情况

还没有完工,雏形。。。

 

#include <bits/stdc++.h>
#define  debug
using namespace std;
const  int MM=16777216; //2 ^ 24  至多有23张牌   不需要存储54张牌,。
int pai[14][5];

char f[MM]; //处处,哪些牌可以一次出完。
char dp[MM];
int S=0;
map map1;

int case[12]={0,2, 4,1,2,3,};

void read(){


}

void init(){

    vector<int> dan;
    vector<int> duizi;
    vector<int> sanzhang;
    vector<int>
//单张
    for(int s = 0; s<=(1<<n-1); s++  ){
       f[s] = 1;
    }


    //四张,三张


     for(int i=0;i<=13;i++)
    {
       1 <<pai [i][1]  | 1<<pai[2]  |  1<<pai[i][3] | 1<<pai[i][4]  &  (1<<13-1)
    }






                          ]

    for(int i=0;i<=13;i++)
    {
        int mycount=0;
        for(int j=1;i<=4;j++){
            if( pai[i][j] !=-1 ){
                mycount++;
            }
        }
        shu[i] = mycount;


}

void solve(){




}


int main()
{
   int  T;
   cin>>T;

   while(T--){
        S=0;
        memset(f,0,sizeof(S));
        fill(pai, pai+13, 26;)//for
        memset(dp,0,sizeof(dp));

        int n; cin>>n;
        for(int i=0;i<n;i++){
            int a,b;    cin >>a>>b;
            pai[a][b]= i;
            map1[i]=a;
        }

        #ifdef debug
            cout<<" S:" << bitset<64>(S) << endl;
        #endif
        init();
        solve();
        cout << dp[S];

   }

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值