題目大意:給定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,...