題意:給出n個不同的串,長度一樣,別人隨機選乙個串,你要詢問他那個串某乙個位置是什麼字元直到能確定那個串才能停止,問詢問次數的期望。
題解:50個串20個位置容易想到狀壓,把字串長度狀壓先考慮能否在某乙個狀態確定哪些字串能確定哪些不能確定,需要2^m*m次,然後時間上不能再乘以n不然會爆,想想只要我知道到達某乙個猜位置狀態的概率dp[i],再知道相對應有哪些字串可以確定和不可以確定,用f[i]來表示,那麼對於不能確定的字串相當於就要再猜一步,那麼加上這個狀態的概率就行了,不會再需要乘以n。
求每個狀態對應有哪些可以確定的方法可以把兩個字串兩兩對比起來,對於所有相等位置求出這些位置也不能確定則標記為1,否則標記為0,這樣一圈標記下來之後對於f[i]陣列如果在i狀態下兩個字串不能互相識別,那麼必定被標記為1,當然如果對於f[i]如果某個狀態的是包含於另乙個狀態的則要進行或運算,說著有點麻煩,不過看一下**就清楚了
#include #include#include
#include
#include
#include
#include
#include
using
namespace
std;
#define eps 1e-10typedef
long
long
ll;const
int maxn = (1
<<20) + 10
;const
int inf =1e9 ;
const
double eps = 1e-8
;const
int mod = 2520
;ll f[maxn],bin[
60];
double
dp[maxn];
intn;
char ss[55][25
];int
cal(ll u)
return
cnt;
}int
main()
for(int i = 0;i < n;i++)
scanf("%s
",ss[i]);
bin[
0] = 1
;
for(int i = 1;i <= 50;i++) bin[i] = bin[i-1]*2
;
int m = strlen(ss[0
]);
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
}//cout<<(1<<40)<1
;
for(int i = se;i >= 0;i--)
f[0] = bin[n] - 1
;
//for(int i = 0;i <= se;i++)
//cout; dp[
0] = 1.0
;
for(int i = 0;i <= se;i++)
}//cout<}
for(int i = 0;i <= se;i++)
printf(
"%.10f\n
",res/n);
return0;
}
還有我利用公式求出dp[i],i相對應猜了x次,猜中了的概率為y這三者相乘不行,不知道為什麼,先貼一下**
#include #include#include
#include
#include
#include
#include
#include
using
namespace
std;
#define eps 1e-10typedef
long
long
ll;const
int maxn = (1
<<20) + 10
;const
int inf =1e9 ;
const
double eps = 1e-8
;const
int mod = 2520
;ll f[maxn];
double
dp[maxn];
intn;
char ss[55][25
];int
cal(ll u)
return
cnt;
}int
main()
}int se =(1
<1
;
for(int i = se;i >= 0;i--)
f[0] = (1
<1
;
//for(int i = 0;i <= se;i++)
//cout; dp[
0] = 1.0
;
for(int i = 0;i <= se;i++)
}//cout<}
for(int i = 0;i <= se;i++)
printf(
"%.10f\n
",res);
return0;
}
2018 8 1 狀壓 CF482C 題解
noip2016考了一道狀壓dp,一道期望dp 然而這題是狀壓期望dp.所以難度是什麼,省選noi嗎.怎麼辦.題目大意 給定n個字串,甲從中任選出乙個串 即選出每個串的概率相同為1 n 乙要通過詢問甲選出的字串pos位置上的字元是什麼來確定這個串。然而由於有些字串的一些位置上字元相同,所以可能不能通...
Codeforces482B 線段樹構造
題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...
Codeforces482B 線段樹構造
題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...