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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题...

發布時間:2025/3/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,歡迎來到codeforces專題。

今天選擇的問題是1443場次的D題,這題是全場倒數第三題,截止到現在一共通過了2800余人。這題的思路不算難,但是思考過程非常有趣,這也是這一期選擇它的原因。

鏈接:https://codeforces.com/contest/1443

廢話就先說到這里,下面我們就來看題吧。

題意

給定n個整數,對于這n個整數我們可以采取兩種操作。第一種操作是在數組左側選擇連續的k個整數減1,第二種操作是選擇右側的連續k個整數減1。

比如假設數組是[3, 2, 2, 1, 4],比如我們選擇k=2,取最左側進行操作,那么我們會得到[2, 1, 2, 1, 4]。如果我們選擇k=3,再取右側進行操作,可以得到[2, 1, 1, 0, 3]。

現在我們想要知道,給定這樣的數組,我們能否通過這兩個操作將數組清空。如果可以輸出YES,否則的話輸出NO。

樣例

首先輸入一個整數t(

),表示測試數據組數。

對于每組測試數據,首先輸入一個整數n(

),表示數組當中元素的個數。之后輸入一行整數()。可以保證,每一組測試數據的n之和不會超過30000.

題解

由于我們對于k沒有限制,最多我們可以一次對數組內的n個元素全部減一。所以k不是限制我們的因素,最大的限制其實是在元素本身。

我們分析一下會發現,由于數組當中的元素大小不一,這其實是隱形的限制。舉個例子,比如[2, 8, 3]。由于我們只能從兩側開始選擇元素進行操作,所以由于2和3比較小,會導致我們沒有辦法把中間的8消除完。當然無法消除的原因可能有好幾種,但基本上都是由于元素的大小不一導致的。

首先我們對這個問題進行一個簡單的建模,題目當中沒有限制執行的次數,所以減一次和減很多次是一樣的。我們可以把可以合并的操作合并在一起,理解成執行一次可以減去任意的值。并且我們可以把操作反向理解,把數組當中的值看成是容器,這樣我們從數組當中減去值的操作,就可以等價理解成向容器當中輸入水流,這樣會容易理解一些。

我的第一想法很簡單,我們可以求出每個位置能夠從左側和右側分別獲得的最大數值。只要左右兩側能夠獲取的流量之和大于等于容器的容積,那么就說明我們可以獲取到足夠的流量灌滿所有的容器。

我很快就寫出了代碼,建了一個二維數組,dp[i][0]表示第i個元素從左側源頭能夠獲取的最大流量。dp[i][1]表示第i個元素可以從右側源頭獲取到的最大流量。由于我們需要保證每個容器存儲的體積不能超過容量,所以我們需要很容易得出遞推關系。

dp[i][0] = min(dp[i-1][0], a[i])

關系明確了很容易寫出代碼:

using namespace std;int a[30006], dp[30006][2];int main() {int t, n;scanf("%d", &t);rep(z, 0, t) {scanf("%d", &n);rep(i, 1, n+1) scanf("%d", &a[i]);MEM(dp, 0x3f);// 從左側遞推,獲取dp[i][0]rep(i, 1, n+1) {dp[i][0] = min(dp[i-1][0], a[i]);}// 從右側遞推,獲取dp[i][1]Rep(i, n, 0) {dp[i][1] = min(dp[i+1][1], a[i]);}bool flag = 1;rep(i, 1, n+1) {// 如果存在某個元素從左右兩側獲取的流量之和無法灌滿// 則返回NOif (dp[i][0] + dp[i][1] < a[i]) {flag = 0;break;}}puts(flag ? "YES" : "NO");}return 0; }

但是很遺憾,這樣不能AC,因為dp的數組維護的其實是某個位置從左側和從右側能夠獲取的最大值,這是一個理想情況,很有可能這個理想情況是無法實現的。

舉個很簡單的反例:[2, 4, 2, 4, 2],這些元素左右兩邊能夠獲取到的最大流量值都是2,但是這里是有問題的。觀察一下會發現數組當中的兩個4是無法同時滿足的,無法滿足的原因是因為中間的2限制了通過的流量。雖然理論上從左往右和從右往左能夠通過的流量上限都是2,但是這個上限是無法同時取到的。

這個問題用上述的方法是解決不了的,所以需要重新構思。這里我們深入分析會發現一個比較麻煩的點,在于每個點都有兩個源頭,我們無法確定流量分配。不過這個問題也很好解決,因為左右兩邊的流量是沒有區別的。所以我們可以以某一側為主,剩余不夠的流量再由另一側補充。

比如我們可以以左側為主,把左側能夠獲取的流量開啟到最大,不夠地再通過右側補充。如果右側的流量無法補充,那么就說明無解。

我們用dp[i][0]記錄i位置從左側獲取的流量,dp[i][1]記錄i位置從右側獲取的流量。

#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <cmath> #include <cstdlib> #include <string> #include <map> #include <set> #include <algorithm> #include "time.h" #include <functional> #define rep(i,a,b) for (int i=a;i<b;i++) #define Rep(i,a,b) for (int i=a;i>b;i--) #define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x.end();e++) #define mid ((l+r)>>1) #define lson (k<<1) #define rson (k<<1|1) #define MEM(a,x) memset(a,x,sizeof a) #define L ch[r][0] #define R ch[r][1] const int N=1000050; const long long Mod=1000000007;using namespace std;int a[30006], dp[30006][2], min_need[30006][2], record[30006][2];int main() {int t, n;scanf("%d", &t);rep(z, 0, t) {scanf("%d", &n);rep(i, 1, n+1) scanf("%d", &a[i]);MEM(dp, 0x3f);dp[0][1] = 0;bool flag = 1;rep(i, 1, n+1) {# 如果右側需要的流量大于容器容積if (dp[i-1][1] > a[i]) {flag = 0;break;}# 左側能夠獲取的流量,因為i-1從右側獲取的流量也會經過i,所以需要減去dp[i][0] = min(dp[i-1][0], a[i] - dp[i-1][1]);# 需要從右側獲取的流量需要累加dp[i][1] = dp[i-1][1] + max(0, a[i] - dp[i][0] - dp[i-1][1]);}puts(flag ? "YES" : "NO");}return 0; }

雖然這個是很簡單的動態規劃的思想,但是一些細節很容易忽略。比如說i-1位置的右側流量會流經i以及大于i每一個位置。所以每一個位置的右側流量是累加的,是越來越大的。只要能夠把握住這點,AC是不難的。

總體來說這題的難度不大,對于思維的要求不是很高,但是非常考驗思維的縝密性和邏輯性。非常適合用來進行思維鍛煉。

今天的文章就到這里,衷心祝愿大家每天都有所收獲。如果還喜歡今天的內容的話,請來一個三連支持吧~(點贊、關注、轉發)

原文鏈接,求個關注

原創 | codeforces 1443D,解法簡單,思維縝密的動態規劃問題?mp.weixin.qq.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚欧洲精品视频在线观看 | 日本人の夫妇交换 | 色污网站 | 欧美做爰猛烈床戏大尺度 | av资源免费看 | 成人黄色a级片 | 婷婷成人综合 | 视频日韩 | 成人av影院 | 国产免费一区二区三区三州老师 | 亚洲欧美国产日韩精品 | 精品亚洲永久免费 | 美味的客房沙龙服务 | 岛国一区 | 日韩超碰在线 | 日本欧美不卡 | 四虎综合| 麻豆av影院 | 欧美视频第二页 | 撕开少妇裙子猛然进入 | 91精品国产欧美一区二区成人 | 午夜国产在线观看 | 男生女生插插插 | 卡通动漫精品一区二区三区 | 久久久99精品国产一区二区三区 | 真人真事免费毛片 | 免费久久一级欧美特大黄 | 成年人黄色片网站 | 在线成人av网站 | 日韩视频免费播放 | 国产www精品| 香蕉久久久久久久av网站 | 特级西西人体4444xxxx | 性开放淫合集 | 久久免费激情视频 | 国产欧美日本在线 | 欧美一级视频在线观看 | 国产一级特黄视频 | 阿娇全套94张未删图久久 | 18久久久 | 久久黄色一级 | 欧美四区 | 日韩射 | 精品少妇久久 | 亚洲精品无码永久在线观看 | 黄色三级网络 | xxxx毛片| www.成人在线 | 曰本女人与公拘交酡 | 久久不射网 | 在线看一级片 | 亚洲三级影视 | 欧美男人又粗又长又大 | 青青青青草| 久久久久久色 | 大黑人交交护士xxxxhd | 在线视频 一区二区 | 在线观看国产一级片 | 五十路在线 | 亚洲一区二区三区四区电影 | 91涩涩涩 | 扩阴视频 | 欧美色图88| 天天影视插插插 | 亚洲色精品三区二区一区 | 亚洲666 | 日韩大片免费观看 | 亚洲高清免费观看 | 日韩高清网站 | 日韩经典中文字幕 | 日本伊人影院 | 亚洲欧洲自拍 | 伊人一区二区三区四区 | 国产麻豆网 | av免费不卡 | 国产精品亚洲а∨天堂免在线 | 日韩欧美在线一区二区 | 西西毛片 | 亚洲精品无码久久久久久久 | 亚洲乱码精品久久久久.. | 日本欧美亚洲 | 日本欧美一本 | 国产偷自拍 | 成年午夜视频 | 国产一级片播放 | 海角社区登录 | www,久久久| 日本一品道 | 在线观看 中文字幕 | 九九资源网 | 久久欧美 | 极品少妇一区二区三区 | 精品欧美一区二区三区 | 午夜一本| 精品乱码一区内射人妻无码 | 久久1024| 国产欧美精品国产国产专区 | 一级黄色免费看 | 在线看国产精品 |