日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

E:Sleeping Schedule(DP)

發(fā)布時(shí)間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 E:Sleeping Schedule(DP) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

或許更好的閱讀體驗(yàn)

Sleeping Schedule

思路

這道題讀題就感覺像時(shí)DPDPDP,讀完題后更加堅(jiān)定了,這是一道DPDPDP題目。

我們考慮狀態(tài)轉(zhuǎn)移方程,dp[i][j]dp[i][j]dp[i][j]表示在第iii次入睡時(shí)間是jjj的時(shí)候的時(shí)間最優(yōu)值,所以顯然有我們的狀態(tài)轉(zhuǎn)移方程就是

dp[i][(j+a[i])%n]=max((dp[i][j+a[i])%n),dp[i?1][j]+1dp[i][(j + a[i]) \% n] = max((dp[i][j + a[i]) \% n), dp[i - 1][j] + 1dp[i][(j+a[i])%n]=max((dp[i][j+a[i])%n),dp[i?1][j]+1,這里的j枚舉的是上一次入睡的時(shí)間,因?yàn)槭撬惶炻?#xff0c;所以下一次睡覺的時(shí)間就是(j+a[i])%b(j + a[i]) \% b(j+a[i])%b

當(dāng)然這里并沒有考慮完備,因?yàn)槲覀冞€有一個(gè)時(shí)間時(shí)是(j+a[i]?1)%n(j + a[i] - 1) \% n(j+a[i]?1)%n,但是轉(zhuǎn)移過程跟上面是一樣的,這里就不多列式子了。

接下來我在代碼里說一些我wa過得坑點(diǎn)。

代碼

#include <bits/stdc++.h>using namespace std;typedef long long ll;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x; }const int N = 2e3 + 10;int dp[N][N], a[N], n, h, l, r;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false);n = read(), h = read(), l = read(), r = read();for(int i = 1; i <= n; i++)a[i] = read();memset(dp, -1, sizeof dp);//初始化,dp[0][0] = 0;//只有這個(gè)狀態(tài)是合理的,所以初始化為0.for(int i = 1; i <= n; i++)for(int j = 0; j < h; j++) {//昨天是在j時(shí)入睡的,if(dp[i - 1][j] < 0) continue;//只能從上面一個(gè)合理的狀態(tài)轉(zhuǎn)移過來,所以上一個(gè)狀態(tài)一定要滿足是>= 0的,if((a[i] + j) % h >= l && (a[i] + j) % h <= r)//隔a[i]dp[i][(a[i] + j) % h] = max(dp[i][(a[i] + j) % h], dp[i - 1][j] + 1);elsedp[i][(a[i] + j) % h] = max(dp[i][(a[i] + j) % h], dp[i - 1][j]);if((a[i] + j - 1) % h >= l && (a[i] + j - 1) % h <= r)//隔a[i] - 1dp[i][(a[i] + j - 1) % h] = max(dp[i][(a[i] + j - 1) % h], dp[i - 1][j] + 1);elsedp[i][(a[i] + j - 1) % h] = max(dp[i][(a[i] + j - 1) % h], dp[i - 1][j]);}int ans = 0;for(int i = 0; i < h; i++)//從0 ~ h - 1枚舉,并不是1 ~ n,這點(diǎn)一定注意。ans = max(ans, dp[n][i]);printf("%d\n", ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的E:Sleeping Schedule(DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。