bozj2669(容斥 狀壓dp)

2021-08-29 04:01:04 字數 1114 閱讀 5936

一張圖最多8個區域性最小值。

dp[i][j]表示正在填從小到大第i個數,區域性最小值所在的位置已被填的情況為j時的方案數

p[i] 為區域性最小值所在的位置已被填的情況為j時,所有可以填數的位置數。(x為沒被填的區域性最小值,x的周圍都不能填,如果填了x就不是區域性最小值了!所以才會存在可以填數的位置數)

當i 不為區域性最小值時 dp[i][j] += dp[i-1][j]*(p[i] - i + 1); 

當i 為區域性最小值時,列舉i填的是狀態j中的哪乙個區域性最小值 dp[i][j] += dp[i-1][j^(1<<(k-1))];

在第二種情況時,是區域性最小值的點一定是區域性最小值,不是區域性最小值的點可能會變成區域性最小值,需要剪掉多算的部分。

在dfs時容斥一下=、=

這個寫的特別好)

#include#include#includeusing namespace std;

const int mod = 12345678;

int n, m, zl[15][2] = ,,,,,,,,};

char chu[5][10];

int ans, p[260], f[50][260], zhan[10][8], vis[10][10];

int dp()

}for(int k = 0; k < (1 << top); k++)

if(vis[i + zl[z][0]][j + zl[z][1]] == 1) break;

} }

f[0][0] = 1;

for(int i = 1; i <= n * m; i++)

for(int j = 0; j < (1 << top); j++)

}return f[n*m][(1<> n >> m;

for(int i = 1; i <= n; i++)

scanf("%s",chu[i]+1);

for(int i = 1; i <= n; i++)

for(int j = 1; j <= m; j++)

}dfs(1,1,0);

cout << (ans + mod) %mod;

return 0;

}

BOZJ1833詳細題解

bozj1833 給定兩個正整數a和b,求在 a,b 中的所有整數中,每個數碼 digit 各出現了多少次。輸入檔案中僅包含一行兩個整數a b,含義如上所述。輸出檔案中包含一行10個整數,分別表示0 9在 a,b 現了多少次。1 99 9 20 20 20 20 20 20 20 20 20 說是一...

BOZJ 1927 Sdoi2010 星際競速

題鏈 題解 顯然是個dag 建圖和有向圖最小路徑覆蓋的建圖有些相似。都是拆點為 u u 分別表示出點和入點。也都要保證每個點最多有乙個出度和乙個入度。但因為帶權,要求最小花費,切要滿足每個點都去一次,既要滿足流量,所以採用最小費用最大流。s u 1,0 因為每個點都會到達,所以都可以有乙個出度 可以...

bozj3289 Mato的檔案管理

莫隊裸題。開個樹狀陣列,跟維護逆序對一模一樣 動態逆序對?由於只有邊界上的點加減,應該算作偽動態逆序對。然後記得離散化一下。不然就炸了。似乎不會有重複的數字吧。似乎開平衡樹的話也能跑。然而平衡樹寫掛了。開平衡樹唯一好的地方就是不需要離散化了。不過沒什麼用。1 include 2 include 3 ...