這題看起來不難然而一堆細節。。
首先不難看出這是乙個類似於揹包的 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 的概率。決策...