POJ 3071 dp,單調佇列

2021-07-30 06:02:30 字數 689 閱讀 1187

題目大意:給定n個數字和m,現在需要把他分成若閣個連續的組,使得每組的的sum都必須要不大於m,問所有組的最大數字之和的最小值是多少;

題目解析:一開始看到最大值的最小值就想到了二分,其實大可不必,以後還是要提醒自己以後這種分組的題目大多可以用dp來做,dp[i]=min(dp[j]+max(j+1,j+2.......i)),其中要滿足後面的j+1到i的sum要不大於m並且維護最大值,就是單調佇列了,樸素dp是需要o(n^2)的,用單調佇列只需要列舉單調佇列中元素即可,這正是巧妙的地方,原因還在於我們定義dp[i]的妙處,dp[i]已經是前i個的最優解了(有點抽象難以具體闡述)。

ac**:

#include#include#include#include#include#define inf 0x7ffffffff

using namespace std;

typedef long long ll;

const int maxn=100010;

ll a[maxn],dp[maxn],n,m,q[maxn];

int main()

dp[0]=0;

int front=0,rear=0,t=0,flag=0;

ll sum=0;

for(int i=1;i<=n;i++)

while(sum>m) sum-=a[++t];

while(front

POJ3071 Football 概率DP 簡單

題意 有2 n個隊伍,給出每兩個隊伍之間的勝率,進行每輪淘汰數為隊伍數 2的淘汰賽 每次比賽都是相鄰兩個隊伍進行 問哪只隊伍成為冠軍概率最大。很基礎。1 include2 include3 include4 include5 include6 include7 using namespace std...

POJ2373 單調佇列優化DP

這道題調了我一天.呃.開始很多地方沒注意.傳說中樓教主的男人八題搞定一道.這道題是一道典型的dp題.但直接做時死超的.所以要用單調佇列來優化.關於最基礎的單調佇列.我前一篇文章已經說了.所以直接分析本題.題意是說有乙個直線的山脊.噴泉是乙個在中間向兩邊同時噴的.最近噴a.最遠b.同時山脊上有牛.每只...

POJ 2373 單調佇列優化DP

題意 思路 f i min f j 1 2 i j 2 i表示當前在第i個點。f i 表示當前最少的線段個數 先是n 2的樸素dp 果斷tle by siriusren include include include using namespace std int n,l,a,b,tot 1,xx,...