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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

CF1131 G. Most Dangerous Shark (单调栈优化dp)

發(fā)布時(shí)間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1131 G. Most Dangerous Shark (单调栈优化dp) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • problem
  • solution
  • code

problem

solution

dpi:dp_i:dpi?:iii個(gè)多米諾骨牌全都倒下的最小花費(fèi)

li,ril_i,r_ili?,ri?分別表示第iii個(gè)多米諾骨牌倒下時(shí)所能波及到的最左/右位置

  • 往左倒,則[li,i)[l_i,i)[li?,i)內(nèi)的牌都可以選擇性地先推倒

    dpi=min?{dpj+costi∣li?1≤j<i}dp_i=\min\{dp_j+cost_i\big|l_i-1\le j<i\}dpi?=min{dpj?+costi??li??1j<i}

  • 被后面的牌左倒后推倒

    dpi=min?{dpj?1+costj∣j<i≤rj}dp_i=\min\{dp_{j-1}+cost_j\big|j<i\le r_j\}dpi?=min{dpj?1?+costj??j<irj?}

性質(zhì):相鄰兩多米諾骨牌的波及范圍只有包含或相離關(guān)系

顯然,若iii能波及jjj,則jjj能波及范圍一定能被iii波及到

兩種情況都可以用單調(diào)棧優(yōu)化求解,O(m)O(m)O(m)

code

#include <stack> #include <cstdio> #include <vector> using namespace std; #define maxm 10000007 #define maxn 250005 #define int long long int n, m, Q; stack < int > st; vector < int > a[maxn], c[maxn]; int h[maxm], w[maxm], l[maxm], r[maxm], dp[maxm];signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1, k;i <= n;i ++ ) {scanf( "%lld", &k );a[i].resize( k );c[i].resize( k );for( int j = 0;j < k;j ++ )scanf( "%lld", &a[i][j] );for( int j = 0;j < k;j ++ )scanf( "%lld", &c[i][j] );}scanf( "%lld", &Q );int cnt = 0;while( Q -- ) {int id, mul;scanf( "%lld %lld", &id, &mul );for( int i = 0;i < a[id].size();i ++ )h[++ cnt] = a[id][i], w[cnt] = c[id][i] * mul;}for( int i = 1;i <= m;i ++ ) {while( ! st.empty() && h[st.top()] + st.top() <= i )r[st.top()] = i - 1, st.pop();st.push( i );}while( ! st.empty() ) r[st.top()] = m, st.pop();for( int i = m;i;i -- ) {while( ! st.empty() && st.top() - h[st.top()] >= i )l[st.top()] = i + 1, st.pop();st.push( i );}while( ! st.empty() ) l[st.top()] = 1, st.pop();//維護(hù)往右倒的最小花費(fèi)單調(diào)棧for( int i = 1;i <= m;i ++ ) {dp[i] = w[i] + dp[l[i] - 1];while( ! st.empty() && r[st.top()] < i ) st.pop();if( ! st.empty() ) dp[i] = min( dp[i], w[st.top()] + dp[st.top() - 1] );if( st.empty() || w[i] + dp[i - 1] < w[st.top()] + dp[st.top() - 1] )st.push( i );}printf( "%lld\n", dp[m] );return 0; }

總結(jié)

以上是生活随笔為你收集整理的CF1131 G. Most Dangerous Shark (单调栈优化dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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