動態規劃典型例題

2021-08-05 21:22:15 字數 1516 閱讀 7213

題目描述

一天,ykc在學校閒的無聊,於是決定上街買點吃的,ykc很懶,本來就不是很像逛街,於是找來了czl幫他買,這裡應該有滑稽,而czl也不願為ykc買東西吃,但是ykc很強勢,非讓他去買,呢沒辦法了,然而czl還有很多事要做,沒呢麼多時間幫ykc,而這條小吃街又很長,有n家店,n有50000這麼大,並且這n家店的商品價值有所不同(要知道,商品的價值可能為負,哈哈,很神奇吧,但是czl肯定不會傻到賠錢,所以***),哇,czl要瘋了,他不想逛這麼久啊,他還有個毛病,他只會連續的逛若干家店,並且由於這條街的店很多,所以肯定不會是一條直線,換句話說就是首尾相連,即第n家店和第一家店是連在一起的,然而ykc希望czl買的東西價值最大,不然就會不開心,於是他就把艱難的任務交給你了,他真的不想浪費時間,你能幫助他嗎? 輸入

第1行:小吃街的長度n(2 <= n <= 50000)

第2 - n+1行:n個整數,代表每個店的商品價值 (-10^9 <= s[i] <= 10^9) 輸出

czl能買到的最大價值

樣例輸入

6

-2 11 -4 13 5 -2

樣例輸出
25
本題考查的知識點是最大子串行和,不同的是數是首尾相連的,也就迴圈的數。

首先我們先討論一下不迴圈的一大串數:

最大和一定是某一段數相加,其中裡面可能有負數,那我們就依次求和,兩者取最大值就可以了

**如下:

#include #include #include using namespace std;

const int max=1e3+10;

int a[max];

int main()

printf("%d\n",ans);

} return 0;

}

如果是迴圈的數呢,那麼最大和會在中間或兩頭出現;出現在中間時,上述**就能解決。

如果出現在兩頭呢?

反過來想一下,如果最大和出現在兩邊,那麼最小和一定會出現在中間,那我們就可以用上述**求最小和,用整個數的和減去最小和就會產生最大和,然後和中間的最大和進行比較,取最大即可。

**如下:

#include #include #include using namespace std;

const int max=1e3+10;

int a[max];

int main()

printf("%d\n",max(ans1, sum-ans2));

} return 0;

}

ac**:

#include #include #include using namespace std;

const int max=5e4+10;

long long int a[max];

int main()

printf("%lld\n",max(ans1, sum-ans2));

}return 0;

}

動態規劃典型例題解析

動態規劃的主要思想是把問題劃分為乙個個子狀態,乙個狀態的最優解往往是基於其前乙個狀態的最優解。兩個狀態之間的關係,我們就稱之為狀態轉移方程。這裡引出了狀態和狀態轉移方程的概念 狀態是乙個當前的值,這個值是通過前乙個值以及狀態轉移方程推得的。在解決動態規劃問題的時候,我們往往會把問題建模為乙個一維陣列...

規劃模型的典型例題

規劃模型的典型例題 3 最優組隊問題 有七種規格的包裝箱要裝到兩輛平板車上。包裝箱的寬和高是一樣的,但厚度t 厘公尺 和重量w 公斤 是不同的。下表給出了每種包裝箱的厚度,重量以及數量。每輛平板車有10.2公尺的地方可用來裝包裝箱 象麵包片那樣 載重為40噸。由於地區貨運的限制,對c5,c6,c7類...

動態規劃例題

題目描述 有一條很長的數軸,一開始你在0的位置。接下來你要走n步,第i步你可以往右走ai或者bi。問n步之後,0到m的每個位置,能不能走到?輸入格式 第一行,兩個整數n,m。接下來n行,每行兩個整數ai,bi。輸出格式 一行,一共m 1個數,每個數都是0或1表示能否走到,數字之間不用空格隔開。樣例輸...