青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Tim's Programming Space  
Tim's Programming Space
日歷
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
統(tǒng)計(jì)
  • 隨筆 - 20
  • 文章 - 1
  • 評(píng)論 - 40
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿(3)

隨筆檔案

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 
http://acm.pku.edu.cn/JudgeOnline/problem?id=1739
基于連通性狀態(tài)壓縮的動(dòng)態(tài)規(guī)劃(名字真長(zhǎng)- -!)其實(shí)不算太難,以前都被它嚇住了。
hyf教了一次后,印象極其深刻,回路、路徑條數(shù)啥的從此再也不用向美國(guó)(霧)進(jìn)口了。
簡(jiǎn)要的說(shuō):f[i][j][k]表示在(i,j)這個(gè)格子的時(shí)候,m+1個(gè)插頭的情況是k,然后根據(jù)(i,j)左邊和上邊插頭(括號(hào)?)的情況進(jìn)行連接,然后轉(zhuǎn)移到下一個(gè)格子。一個(gè)合法的狀態(tài)是一個(gè)括號(hào)表達(dá)式,有左括號(hào),右括號(hào)和空格,且左右括號(hào)匹配。一個(gè)左括號(hào)和一個(gè)相應(yīng)的右括號(hào)表示這兩個(gè)地方的路徑是連在一起的。轉(zhuǎn)移的時(shí)候分情況討論。
處理的時(shí)候先把所有合法的狀態(tài)都dfs出來(lái),轉(zhuǎn)移的時(shí)候就方便了。。
PS:居然驚喜地進(jìn)入了status第一頁(yè)?!。。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAXN 8
#define BLANK 0
#define LEFT 1
#define RIGHT 2
#define MAXSTATE 174420
#define MAXSTATEAMOUNT 835
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define ll long long

using namespace std;

int n,m;
char map[MAXN+1][MAXN+1];
int nState = 0;
int State[MAXSTATEAMOUNT+1];
int id[MAXSTATE+1];
int Tx, Ty, FinalState;
ll f[MAXN+1][MAXN+1][MAXSTATEAMOUNT+1];
ll ans;
void Reset(){
     nState = 0, Tx = -1;
     memset(f, 0, sizeof(f));
     ans = 0;
}

bool Init(){
     scanf("%d%d",&n,&m);
     if (!n) return false;
     Reset();
     for (int i = n-1; i>=0; i--){
         scanf("%s", map[i]);
         if (Tx == -1)
         for (int j = m-1; j>=0; j--)
             if (map[i][j] == '.'){
                Tx = i, Ty = j;
                break;
             }
         for (int j = 0; j<m; j++)
             if (map[i][j] == '.') map[i][j] = 0;
             else map[i][j] = 1;
     }
     return true;
}

void dfs(int pos, int r_bracket, int state){
     if (pos < 0){
        State[nState] = state;
        id[state] = nState;
        /*
        printf("%d: ", nState);
        for (int i = 0; i<=m; i++)
            printf("%d ", buffer[i]);
        printf("\n");
        */
        nState ++;
        return;
     }
     if (pos >= r_bracket) // blank
        dfs(pos - 1, r_bracket, (state << 2));
     if (pos > r_bracket) // right bracket
        dfs(pos - 1, r_bracket + 1, (state << 2) | RIGHT);
     if (r_bracket) // left bracket
        dfs(pos - 1, r_bracket - 1, (state << 2) | LEFT);
}

#define MASK 3
#define Get(state, p) (((state) >> (p<<1)) & MASK)

inline bool OK(int i, int j, int state){
     if (Get(state, j) == 1 && Get(state, j+1) == 2 && !(i == Tx && j == Ty)) return false;
     for (int k = 0; k<j; k++)
         if ((map[i][k] || map[i+1][k]) && Get(state, k)) return false;
     if (((j && map[i][j-1]) || (map[i][j])) && Get(state, j)) return false;
     for (int k = j+1; k<=m; k++)
         if (((i && map[i-1][k-1]) || (map[i][k-1])) && Get(state, k)) return false;
     return true;
}

inline int Modify(int state, int p, int v){
    return state - (((state >> (p << 1)) & MASK) << (p << 1)) + (v << (p << 1));
}

inline int FindRight(int p, int state){
    int cnt = 0, t;
    for (int i = p; i<=m; i++){
        t = Get(state,i);
        if (t == 1) cnt++;
        if (t == 2) cnt--;
        if (cnt == 0) return i;
    }
    return -1;
}

inline int FindLeft(int p, int state){
    int cnt = 0, t;
    for (int i = p; i>=0; i--){
        t = Get(state, i);
        if (t == 2) cnt++;
        if (t == 1) cnt--;
        if (cnt == 0) return i;
    }
    return -1;
}

void Solve(){
     dfs(m, 0, 0);
     f[0][0][id[(1 << 2) + (2 << (2 * m))]] = 1;
     FinalState = (1 << (2 * Ty)) + (2 << (2 * (Ty+1)));
     int p, q, tmp, tmp2, state, v, i, j, k;
     ll *a;
     for (i = 0; i < n; i++){
         for (j = 0; j < m; j++){
             a = f[i][j+1];
             for (k = 0; k < nState; k++)
                 if ((v = f[i][j][k])){
                     state = State[k];
                     p = Get(state, j), q = Get(state, j+1);
                     if (p == 0 && q == 0){
                        if (!map[i][j]){
                            tmp = Modify(Modify(state, j, 1), j+1, 2);
                            if (OK(i, j+1, tmp))
                               a[id[tmp]] += v;
                        }else
                             a[k] += v;
                     }else if(p == 0){ // conditions below ensured map[i][j] is empty, because there exists at least one bracket on one side of the grid (i,j)
                           if (OK(i, j+1, state))
                              a[k] += v;
                           tmp = Modify(Modify(state, j, q), j+1, 0);
                           if (OK(i, j+1, tmp))
                              a[id[tmp]] += v;
                     }else if (q == 0){
                           if (OK(i, j+1, state))
                              a[k] += v;
                           tmp = Modify(Modify(state, j, 0), j+1, p);
                           if (OK(i, j+1, tmp))
                              a[id[tmp]] += v;
                     }else{
                         tmp = Modify(Modify(state, j, 0), j+1, 0);
                         if (p == 1 && q == 1){
                               tmp2 = Modify(tmp, FindRight(j+1, state), 1);
                               if (OK(i, j+1, tmp2))
                                  a[id[tmp2]] += v;
                         }else if (p == 2 && q == 2){
                               tmp2 = Modify(tmp, FindLeft(j, state), 2);
                               if (OK(i, j+1, tmp2))
                                  a[id[tmp2]] += v;
                         }else if (p == 1 && q == 2){
                               if (i == Tx && j == Ty && state == FinalState){
                                  printf("%I64d\n", v);
                                  return;
                               }
                         }else if (p == 2 && q == 1){
                               if (OK(i, j+1, tmp))
                                  a[id[tmp]] += v;
                         }
                     }
                 }
         }
         for (int k = 0; k < nState; k++)
             if (Get(State[k], m) == 0 && OK(i+1, 0, tmp = (State[k] << 2)))
                f[i+1][0][id[tmp]] += f[i][m][k];
     }
     printf("%I64d\n", ans);
}

int main(){
    while (Init())
          Solve();
    return 0;
}


posted on 2010-04-10 13:59 TimTopCoder 閱讀(639) 評(píng)論(1)  編輯 收藏 引用
評(píng)論:
  • # re: 男人8題-Tony's Tour-PKU1739-基于連通性狀態(tài)壓縮的動(dòng)態(tài)規(guī)劃。。[未登錄](méi)  hyf Posted @ 2010-04-17 19:51
    膜拜T神  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


 
Copyright © TimTopCoder Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美一区二区三区在线看蜜臀| 亚洲蜜桃精久久久久久久| 老**午夜毛片一区二区三区| 亚洲电影欧美电影有声小说| 国产精品系列在线| 欧美成人免费全部| 久久久久久久999| 裸体丰满少妇做受久久99精品| 欧美成人三级在线| 欧美高清视频一区二区| 亚洲欧美成人| 久久国产99| 欧美一区二区三区在| 亚洲欧美国产日韩中文字幕| 欧美日韩亚洲综合一区| 欧美日韩亚洲一区二区| 亚洲欧洲在线播放| 亚洲韩日在线| 亚洲人体1000| 母乳一区在线观看| 亚洲精品网址在线观看| 亚洲精品久久久久久久久久久久久 | 欧美日韩精品免费观看| 国产主播喷水一区二区| 一二三区精品| 午夜激情亚洲| 亚洲综合日韩| 免费不卡亚洲欧美| 国产综合久久| 久久精品99| 裸体歌舞表演一区二区| 久久精品毛片| 99精品久久| 亚洲欧美伊人| 欧美成人久久| 日韩午夜精品视频| 久久免费视频这里只有精品| 欧美大片在线看| 美女脱光内衣内裤视频久久影院 | 中国av一区| 欧美一区二区三区在线观看 | 午夜久久福利| 欧美日韩免费一区| 亚洲欧美一区二区三区极速播放 | 欧美在线3区| 欧美日韩国产欧| 亚洲欧美日韩精品一区二区| 欧美福利电影在线观看| 欧美xart系列高清| 亚洲午夜激情网页| 亚洲第一页在线| 亚洲在线观看免费| 欧美大片va欧美在线播放| 亚洲精选在线| 一区二区av在线| 欧美a级在线| 国产一区二区视频在线观看| 一区二区三区欧美亚洲| 免费在线亚洲欧美| 欧美日本韩国一区二区三区| 亚洲国产欧美不卡在线观看| 亚洲欧洲一区二区天堂久久 | 久久米奇亚洲| 欧美日韩一区二区三区在线观看免 | 久久精品国内一区二区三区| 欧美www视频在线观看| 午夜精彩国产免费不卡不顿大片| 久久久人人人| 午夜在线一区| 亚洲深夜激情| 国产精品亚洲视频| 亚洲电影av| 国产日韩精品一区| 99日韩精品| 亚洲激情欧美激情| 欧美一级一区| 亚洲一区二三| 欧美二区不卡| 免费日韩av片| 国产精品九九| 亚洲色图自拍| 欧美成va人片在线观看| 久久精品综合一区| 久久国产精品久久久久久电车| 亚洲美女诱惑| 六十路精品视频| 久久人人看视频| 国产日韩欧美另类| 久久久五月婷婷| 国产精品久久久一区二区三区| 香蕉成人伊视频在线观看| 欧美高清视频一区二区| 99精品黄色片免费大全| 久久一区中文字幕| 蜜臀久久久99精品久久久久久| 国产精品尤物福利片在线观看| 久久九九热免费视频| 国产精品久久久久久模特| 99国产精品久久久| 野花国产精品入口| 欧美理论在线播放| 亚洲精品美女91| 一区二区日韩精品| 欧美日韩视频免费播放| 亚洲国产一区二区精品专区| 国产美女精品一区二区三区| 亚洲天堂激情| 亚洲第一视频| 久久久夜色精品亚洲| 美女主播一区| 亚洲精品裸体| 午夜电影亚洲| 久久精品久久99精品久久| 国产精品亚洲综合| 欧美一区2区三区4区公司二百| 久久婷婷激情| 国产精品视频第一区| 欧美一级艳片视频免费观看| 免费视频一区| 日韩一区二区免费看| 欧美日韩一二三四五区| 亚洲专区欧美专区| 中文有码久久| 亚洲免费播放| 一区二区三区免费观看| 一区二区三区欧美日韩| 久久精品国产亚洲aⅴ| 欧美亚洲在线播放| 牛夜精品久久久久久久99黑人| 亚洲天堂偷拍| 久久精品一二三区| 国产一区二区三区在线播放免费观看 | 欧美黑人国产人伦爽爽爽| 亚洲视频一二三| 免费在线成人| 亚洲欧美日韩国产综合在线 | 亚洲乱码精品一二三四区日韩在线| 欧美日韩一区二区在线| 久久国产精品99国产精| 99精品欧美一区| 免费91麻豆精品国产自产在线观看| 亚洲狼人综合| 国产一区二区三区不卡在线观看| 欧美国产精品va在线观看| 亚洲欧美国产视频| 亚洲黄色毛片| 久久亚洲免费| 欧美一级二级三级蜜桃| 最新日韩在线视频| 国产一区欧美| 国产精品久久久久天堂| 免费亚洲一区二区| 久久精品av麻豆的观看方式 | 亚洲少妇在线| 亚洲第一精品电影| 欧美在线视频一区二区| 久久嫩草精品久久久精品一| 亚洲美女av在线播放| 午夜精品影院| 亚洲国产日本| 一区免费观看| 亚洲国产日本| 亚洲欧洲av一区二区三区久久| 海角社区69精品视频| 久久久免费av| 亚洲一区高清| 亚洲第一区中文99精品| 欧美午夜片在线免费观看| 最新日韩在线视频| 亚洲一级在线观看| 亚洲精品小视频在线观看| 国产欧美亚洲日本| 国产精品亚洲不卡a| 久久精品视频免费| 亚洲美女视频| 国产乱码精品一区二区三区忘忧草| 久久久久久亚洲精品杨幂换脸| 在线免费一区三区| 国产精品久久久久久五月尺| 欧美一区二视频在线免费观看| 国产精品女人网站| 亚洲欧洲一区二区在线播放| 欧美中文字幕精品| 中文无字幕一区二区三区| 亚洲大胆女人| 国产亚洲欧美日韩美女| 欧美性久久久| 久久一区国产| 久久久久五月天| 欧美一区二区在线看| 亚洲影院在线| 亚洲一区免费视频| 日韩网站在线| 91久久精品日日躁夜夜躁国产| 欧美大片在线观看一区二区| 免费观看亚洲视频大全| 欧美一区二视频在线免费观看| 日韩一区二区精品在线观看| 国产欧美精品日韩| 国产精品久久久一区二区|