數學,DP AcWing 232 守衛者的挑戰

2022-09-21 12:24:08 字數 1209 閱讀 9979

這題看起來不難然而一堆細節。。

首先不難看出這是乙個類似於揹包的 dp 問題。

考慮狀態的設計:\(f(i, j, k)\) 表示當前考慮到第 \(i\) 個挑戰,當前揹包剩餘容量為 \(j\),前 \(i\) 個挑戰中已經成功了 \(k\) 個。

那麼我們可以進一步寫出轉移方程:

接下來就是細節問題了:

約定 \(v\) 為地圖殘片的數量。

// problem: 守衛者的挑戰

// contest: acwing

// url:

// memory limit: 256 mb

// time limit: 1000 ms

// // powered by cp editor (

#includeusing namespace std;

#define debug(x) cerr << #x << ": " << (x) << endl

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define dwn(i,a,b) for(int i=(a);i>=(b);i--)

#define pb push_back

#define all(x) (x).begin(), (x).end()

inline void read(int &x)

while(ch>='0' && ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();

x*=s;

}const int n=220;

int n, l, k, v;

double p[n];

int w[n];

int main()

k=min(v, k);

double f[n+1][v<<1|1][n+1];

memset(f, 0, sizeof f);

f[0][v+k][0]=1;

rep(i,1,n) }

double res=0;

rep(i,v,v<<1) rep(j,l,n) res+=f[n][i][j];

printf("%.6lf\n", res);

return 0;

}

AcWing232 守衛者的挑戰(數學 dp)

這題很容易想到轉移方程式,問題是我們發現第三維如果開2000,會炸 但是我們進一步發現,沒必要開2000,因為總共就200個任務,所以揹包容量和減少的量的差值最多 200 200 然後平移一下就是0 400.之後就是dfs轉移,另外,double型別不要用memset轉移 includeusing ...

守衛者的挑戰

題目描述 隊員們被傳送到了乙個擂台上,最初身邊有乙個容量為k的包包。擂台賽一共有項挑戰,各項挑戰依次進行。第項挑戰有乙個屬性ai,如果ai 0,表示這次挑戰成功後可以再獲得乙個容量為ai的包包 如果ai 1,則表示這次挑戰成功後可以得到乙個大小為1的地圖殘片。地圖殘片必須裝在包包裡才能帶出擂台,包包...

守衛者的挑戰

初始值為 k 現經過一段數,有 p i 的概率加上第 i 個數 a i 問最後值 geq0 且加了 l 個數的概率。注意到 k 200 都是沒有意義的,於是可以把 k 的範圍視為 0 leq k leq200 直接設 f i j k 表示處理了第 1 i 個數,加了 j 個數,值為 k 的概率。決策...