国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c++11/c++98動(dòng)態(tài)規(guī)劃入門第5課,經(jīng)典DP問題 --- 區(qū)間

這篇具有很好參考價(jià)值的文章主要介紹了c++11/c++98動(dòng)態(tài)規(guī)劃入門第5課,經(jīng)典DP問題 --- 區(qū)間。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

c++11/c++98動(dòng)態(tài)規(guī)劃入門第5課,經(jīng)典DP問題 --- 區(qū)間,動(dòng)態(tài)規(guī)劃,算法,c++

第1題 ??? 取數(shù)問題?查看測評數(shù)據(jù)信息

? ??有一排N個(gè)數(shù),你和小明2個(gè)人玩游戲,每個(gè)人輪流從2端取數(shù),每次可以從左或右取,不能從中間取。你取的所有的數(shù)的和是你的得分,小明取的所有的數(shù)的和是小明的得分。如果你先取,你最多比小明多得多少分?

輸入格式

??第一行:一個(gè)整數(shù)n,范圍在[0, 100]。

??第二行:n個(gè)整數(shù),每個(gè)數(shù)范圍在[1, 10000]。

輸出格式

??小明足夠聰明時(shí),你最多多得的分?jǐn)?shù)。

輸入/輸出例子1

輸入:

? 4

? 3 2 9 1

輸出:

??9

樣例解釋:??????????

第1輪你取3;

第2輪他取2;

第3輪你取9;

第4輪他取1;

(3+9)-(2+1) = 9

樣例解釋

代碼:

#include<bits/stdc++.h>
using namespace std;
int n,f[105][105],a[105],ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],f[i][i]=a[i];
    for(int i=1;i<=n;i++)
        for(int j=1;j+i<=n;j++)
            f[j][j+i]=max(-f[j+1][j+i]+a[j],-f[j][i+j-1]+a[i+j]);        
    cout<<f[1][n];
    return 0;
}

c++11/c++98動(dòng)態(tài)規(guī)劃入門第5課,經(jīng)典DP問題 --- 區(qū)間,動(dòng)態(tài)規(guī)劃,算法,c++

第1題 ??? 數(shù)字(number)?查看測評數(shù)據(jù)信息

有n個(gè)數(shù)字(0到99)排成一行,每一次可以將相鄰的兩個(gè)數(shù)字相加并對100取模(即除以100的余數(shù)),將結(jié)果取代之前的兩個(gè)數(shù),一次操作的花費(fèi)為兩個(gè)數(shù)字相乘。經(jīng)過n-1次操作后剩下一個(gè)數(shù),問剩下一個(gè)數(shù)時(shí)總花費(fèi)的最小值。

輸入格式

有若干組數(shù)據(jù),每組數(shù)據(jù)第一行為一個(gè)正整數(shù)n(n<=100)表示數(shù)字的個(gè)數(shù)。

第二行為n個(gè)正整數(shù)(0到99)

輸出格式

每組數(shù)據(jù)對應(yīng)的最小花費(fèi)。

輸入/輸出例子1

輸入:

2

18 19

3

40 60 20

?

輸出:

342

2400

樣例解釋

對于第二組數(shù)據(jù)有兩種方案:

1、??先將(40和60)相加得0,再將0?和20相加得20,總花費(fèi)為40*60+0*20=2400

2、??先將(60和20)相加得80,再將40和80相加得20,總花費(fèi)為60*20+40*80=4400

顯然第一種方案較好。

?

樣例解釋

代碼:

#include<bits/stdc++.h>
using namespace std;
int n,a[105],f[105][105],d[105];
int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i = 0;i <= 105;i++){
        	for(int j = 1;j <= 105;j++)
            f[i][j] = 1250000;
        }
        for(int i = 1;i <= 105;i++){
            d[i] = 0;
        }
        for(int i = 1;i <= n;i++){
            cin>>a[i];
            d[i] = d[i-1]+a[i];
            f[i][i] = 0;
        }
        for(int i = 2;i <= n;i++)
            for(int j = i;j <= n;j++){
                int lt = j-i+1;
                for(int k = lt;k < j;k++){
                    int x = (d[k]-d[lt-1])%100;
                    int y = (d[j]-d[k])%100;
                    f[lt][j]=min(f[lt][j],f[lt][k]+f[k+1][j]+x*y);
                }
            }
        cout<<f[1][n]<<endl;
    }
    return 0;
}
  • 測試
第1題 ??? 救災(zāi)?查看測評數(shù)據(jù)信息

為了挽救災(zāi)區(qū)同胞的生命,心系災(zāi)區(qū)同胞的你準(zhǔn)備自己采購一些糧食支援災(zāi)區(qū),現(xiàn)在假設(shè)你一共有資金n元,而市場有m種大米,每種大米都是袋裝產(chǎn)品,其價(jià)格不等,并且只能整袋購買。請問:你用有限的資金最多能采購多少公斤糧食呢?

輸入格式

輸入數(shù)據(jù)首先包含一個(gè)正整數(shù)C,表示有C(C<=10)組測試數(shù)據(jù),每組測試數(shù)據(jù)的第一行是兩個(gè)整數(shù)n和m(1<=n<=100, 1<=m<=100),分別表示經(jīng)費(fèi)的金額和大米的種類,然后是m行數(shù)據(jù),每行包含3個(gè)數(shù)p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分別表示每袋的價(jià)格、每袋的重量以及對應(yīng)種類大米的袋數(shù)。

輸出格式

對于每組測試數(shù)據(jù),請輸出能夠購買大米的最多重量,你可以假設(shè)經(jīng)費(fèi)買不光所有的大米,并且經(jīng)費(fèi)你可以不用完。每個(gè)數(shù)據(jù)的輸出占一行。

輸入/輸出例子1

輸入:

1

8 2

2 100 4

4 100 2

輸出:

400

樣例解釋

代碼:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[105],b[105],c[105];
int dp[105];
int n,m;   
int main()
{
    int C;
    scanf("%d",&C);
    while(C--)
    {
        memset(dp, 0, sizeof(dp));
        scanf("%d %d",&n,&m);
        for(int i=0; i<m; i++)
        {
            scanf("%d %d %d",&a[i],&b[i],&c[i]);
        }
        for(int i=0; i<m; i++)
        {
            for(int j=1; j<=c[i]; j++)
            {
                for(int k=n; k>=a[i]*j; k--)
                {
                    dp[k]=max(dp[k-a[i]]+b[i], dp[k]);
                }
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}
第3題 ??? 光盤?查看測評數(shù)據(jù)信息

有N張光盤,每張光盤有一個(gè)價(jià)錢,現(xiàn)在要從N張光盤中買M張,預(yù)算為L,每張光盤有一個(gè)快樂值,要求在不超過預(yù)算并且恰好買M張,使得快樂值總和最大。

輸入格式

第一行為一個(gè)正整數(shù)T(1<=T<=5)表示測試數(shù)據(jù)個(gè)數(shù)

每組測試數(shù)據(jù)第一行為三個(gè)正整數(shù)N(N<=100),M(M<=N),L(L<=1000)

接下來的N行每行有兩個(gè)正整數(shù),分別是光盤的價(jià)錢與快樂值。

輸出格式

每組數(shù)據(jù)對應(yīng)的最大快樂值總和(保證小于2^31)。若無解則輸出0.

輸入/輸出例子1

輸入:

1

3 2 10

11 100

1 2

9 1

輸出:

3

樣例解釋

代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = 1010;
const int INF = 1 << 31;
struct Movie
{
    int t,v;
};
Movie movie[MAXN];
int dp[MAXN][MAXN];
int n,m,l;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&l);
        for(int i = 1;i <= m;i++)
            for(int j = 0;j <= l;j++)
                dp[j][i] = -INF;
        for(int j = 0;j <= l;j++)
            dp[j][0] = 0;
        for(int i = 1;i <= n;i++)
            scanf("%d%d",&movie[i].t,&movie[i].v);
        for(int i = 1;i <= n;i++)
            for(int j = l;j >= movie[i].t;j--)
            for(int k = m;k >= 1;k--)
            dp[j][k] = max(dp[j][k],dp[j-movie[i].t][k-1]+movie[i].v);
        int ans = 0;
        for(int i = 1;i <= l;i++)
            if(dp[i][m] > ans)
            ans = dp[i][m];
        printf("%d\n",ans);
    }
    return 0;
}

總結(jié):

狀態(tài):線性DP --?--?區(qū)間DP

階段:長度

階段的方向:2種??------?取決于“子問題”文章來源地址http://www.zghlxwxcb.cn/news/detail-653658.html

到了這里,關(guān)于c++11/c++98動(dòng)態(tài)規(guī)劃入門第5課,經(jīng)典DP問題 --- 區(qū)間的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 區(qū)間dp(動(dòng)態(tài)規(guī)劃)

    區(qū)間dp(動(dòng)態(tài)規(guī)劃)

    動(dòng)態(tài)規(guī)劃(dp)是一種通過將問題分解為子問題,并利用已解決的子問題的解來求解原問題的方法。適用于具有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的優(yōu)化問題。通過定義狀態(tài)和狀態(tài)轉(zhuǎn)移方程,動(dòng)態(tài)規(guī)劃可以在避免重復(fù)計(jì)算的同時(shí)找到問題的最優(yōu)解,是一種高效的求解方法,常用于

    2024年02月15日
    瀏覽(18)
  • 動(dòng)態(tài)規(guī)劃——區(qū)間DP 學(xué)習(xí)筆記

    不含四邊形不等式優(yōu)化。 線性動(dòng)態(tài)規(guī)劃的局限性在于,它只能順推或倒退,而不能有子區(qū)間依賴的問題。 區(qū)間動(dòng)態(tài)規(guī)劃是線性動(dòng)態(tài)規(guī)劃的擴(kuò)展,它將問題劃分為若干個(gè)子區(qū)間,并通過定義狀態(tài)和狀態(tài)轉(zhuǎn)移方程來求解每個(gè)子區(qū)間的最優(yōu)解,最終得到整個(gè)區(qū)間的最優(yōu)解。 區(qū)間動(dòng)

    2024年02月08日
    瀏覽(31)
  • 動(dòng)態(tài)規(guī)劃——區(qū)間dp [石子合并]

    動(dòng)態(tài)規(guī)劃——區(qū)間dp [石子合并]

    動(dòng)態(tài)規(guī)劃(dp)是一種通過將問題分解為子問題,并利用已解決的子問題的解來求解原問題的方法。適用于具有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的優(yōu)化問題。通過定義狀態(tài)和狀態(tài)轉(zhuǎn)移方程,動(dòng)態(tài)規(guī)劃可以在避免重復(fù)計(jì)算的同時(shí)找到問題的最優(yōu)解,是一種高效的求解方法,常用于

    2024年02月12日
    瀏覽(21)
  • 動(dòng)態(tài)規(guī)劃系列 | 一文搞定區(qū)間DP

    動(dòng)態(tài)規(guī)劃系列 | 一文搞定區(qū)間DP

    區(qū)間 DP 可以用于解決一些涉及到區(qū)間合并或分割的問題。區(qū)間 DP 通常有以下三個(gè)特點(diǎn): 合并(分割) :將兩個(gè)或多個(gè)部分進(jìn)行整合,或者反過來將一個(gè)區(qū)間分解成多個(gè)部分。 特征 :能將問題分解為能兩兩合并的形式。 求解 :對整個(gè)問題設(shè)最優(yōu)解,枚舉合并點(diǎn),將問題分

    2024年02月02日
    瀏覽(22)
  • 石子合并(動(dòng)態(tài)規(guī)劃 區(qū)間DP)+詳細(xì)注釋

    原題鏈接 ? 活動(dòng) - AcWing 題目 設(shè)有?N?堆石子排成一排,其編號為?1,2,3,…,N。 每堆石子有一定的質(zhì)量,可以用一個(gè)整數(shù)來描述,現(xiàn)在要將這?N?堆石子合并成為一堆。 每次只能合并相鄰的兩堆,合并的代價(jià)為這兩堆石子的質(zhì)量之和,合并后與這兩堆石子相鄰的石子將和新堆相

    2024年02月16日
    瀏覽(24)
  • acwing算法基礎(chǔ)之動(dòng)態(tài)規(guī)劃--線性DP和區(qū)間DP

    線性DP:狀態(tài)轉(zhuǎn)移表達(dá)式存在明顯的線性關(guān)系。 區(qū)間DP:與順序有關(guān),狀態(tài)與區(qū)間有關(guān)。 題目1 :數(shù)字三角形。 解題思路:直接DP即可, f[i][j] 可以來自 f[i-1][j] + a[i][j] 和 f[i-1][j-1] + a[i][j] ,注意 f[i-1][j] 不存在的情況(最后一個(gè)點(diǎn))和 f[i-1][j-1] 不存在的情況(第一個(gè)點(diǎn))。

    2024年02月04日
    瀏覽(21)
  • 11.動(dòng)態(tài)規(guī)劃:樹形DP問題、樹上最大獨(dú)立集、樹上最小支配集、換根DP、樹上倍增(LCA)【靈神基礎(chǔ)精講】

    11.動(dòng)態(tài)規(guī)劃:樹形DP問題、樹上最大獨(dú)立集、樹上最小支配集、換根DP、樹上倍增(LCA)【靈神基礎(chǔ)精講】

    回溯和樹形DP的區(qū)別(什么時(shí)候需要return結(jié)果?):對于回溯,通常是在「遞」的過程中增量地構(gòu)建答案,并在失敗時(shí)能夠回退,例如八皇后。對于遞歸,是把原問題分解為若干個(gè)相似的子問題,通常會(huì)在「歸」的過程中有一些計(jì)算。如果一個(gè)遞歸能考慮用記憶化來優(yōu)化,就

    2024年02月04日
    瀏覽(19)
  • 【動(dòng)態(tài)規(guī)劃 區(qū)間dp 位運(yùn)算】100259. 劃分?jǐn)?shù)組得到最小的值之和

    【動(dòng)態(tài)規(guī)劃 區(qū)間dp 位運(yùn)算】100259. 劃分?jǐn)?shù)組得到最小的值之和

    動(dòng)態(tài)規(guī)劃 區(qū)間dp 位運(yùn)算 給你兩個(gè)數(shù)組 nums 和 andValues,長度分別為 n 和 m。 數(shù)組的 值 等于該數(shù)組的 最后一個(gè) 元素。 你需要將 nums 劃分為 m 個(gè) 不相交的連續(xù) 子數(shù)組,對于第 ith 個(gè)子數(shù)組 [li, ri],子數(shù)組元素的按位AND運(yùn)算結(jié)果等于 andValues[i],換句話說,對所有的 1 = i = m,n

    2024年04月15日
    瀏覽(25)
  • AcWing算法學(xué)習(xí)筆記:動(dòng)態(tài)規(guī)劃(背包 + 線性dp + 區(qū)間dp + 計(jì)數(shù)dp + 狀態(tài)壓縮dp + 樹形dp + 記憶化搜索)

    AcWing算法學(xué)習(xí)筆記:動(dòng)態(tài)規(guī)劃(背包 + 線性dp + 區(qū)間dp + 計(jì)數(shù)dp + 狀態(tài)壓縮dp + 樹形dp + 記憶化搜索)

    算法 復(fù)雜度 時(shí)間復(fù)雜度0(nm) 空間復(fù)雜度0(nv) 代碼 算法 通過滾動(dòng)數(shù)組對01背包樸素版進(jìn)行空間上的優(yōu)化 f[i] 與 f[i - 1]輪流交替 若體積從小到大進(jìn)行遍歷,當(dāng)更新f[i, j]時(shí),f[i - 1, j - vi] 已經(jīng)在更新f[i, j - vi]時(shí)被更新了 因此體積需要從大到小進(jìn)行遍歷,當(dāng)更新f[i, j]時(shí),f[i - 1,

    2024年02月21日
    瀏覽(21)
  • 動(dòng)態(tài)規(guī)劃-經(jīng)典dp(打家劫舍,股票等)

    動(dòng)態(tài)規(guī)劃-經(jīng)典dp(打家劫舍,股票等)

    1.1.1 爬樓梯 ?由于求的是組合數(shù),我們將不同路徑相加即可 dp定義: dp[i]為爬到第i階樓梯的方法數(shù); 轉(zhuǎn)移方程: 初始化: ?由于涉及到i-2和i-1,那么我們要從i=2開始遍歷,因此要初始化dp[0] = 0,dp[1] = 1(根據(jù)定義) 遍歷順序: 從左往右? 完整代碼: ?1.1.2?使用最小花費(fèi)爬樓梯

    2024年01月19日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包