欢迎访问 生活随笔!

生活随笔

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

编程问答

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

发布时间:2023/12/3 编程问答 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CF1131 G. Most Dangerous Shark (单调栈优化dp) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • problem
  • solution
  • code

problem

solution

dpi:dp_i:dpi:iii个多米诺骨牌全都倒下的最小花费

li,ril_i,r_ili,ri分别表示第iii个多米诺骨牌倒下时所能波及到的最左/右位置

  • 往左倒,则[li,i)[l_i,i)[li,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+costili1j<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{dpj1+costjj<irj}

性质:相邻两多米诺骨牌的波及范围只有包含或相离关系

显然,若iii能波及jjj,则jjj能波及范围一定能被iii波及到

两种情况都可以用单调栈优化求解,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();//维护往右倒的最小花费单调栈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; }

总结

以上是生活随笔为你收集整理的CF1131 G. Most Dangerous Shark (单调栈优化dp)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。