HZOJ 礼物
其實是比較簡單的一道期望狀壓dp,考試時一直在想數組表示概率,然而最后出的數總是小于一,于是無奈的把第一個點判掉放棄了其他點。
設f[i]為狀態為i時到全部買到的期望次數,$f[i]=∑f[j]*p[k]+(1-∑p[k])+1$,f[(1<<n)-1]=0,倒著推,k為j中的元素,$i|(1<<(k-1))=j$,然后可以用高斯消元求解(顯然會T啊),其實只要移項就可以了,,時間復雜度:O(2^N)。
?
#include<iostream> #include<cstdio> #include<bitset> #define int LL #define LL long long using namespace std; double f[1<<22],sp; int n,w[21],sum; double p[21]; signed main() { // freopen("in.txt","r",stdin);cin>>n;for(int i=1;i<=n;i++){cin>>p[i]>>w[i];sp+=p[i];sum+=w[i];} f[(1<<n)-1]=0;for(int i=(1<<(n))-2;i>=0;i--){double sum=0,spp=0;for(int k=1;k<=n;k++)if(((1<<(k-1))|i)!=i)spp+=p[k],sum+=p[k]*f[i|(1<<(k-1))];f[i]=(sum+1)/spp;}printf("%lld\n%0.3lf\n",sum,f[0]); }?
?還有一點就是要用longlong,int會wa50,雖然算著只是擦邊,但是這種情況還是開longlong比較好。
?
轉載于:https://www.cnblogs.com/Al-Ca/p/11196784.html
總結
- 上一篇: hadoop集群崩溃恢复记录
- 下一篇: Python定义点击右上角关闭按钮事件