整數劃分(區間DP)

2021-09-23 01:38:54 字數 690 閱讀 5092

題意:給你乙個大數n,和乙個m, 問你在n總插入m-1個乘號,(被分成m段)使最後結果最大。

題解:想遞推方程  dp[i][j]:前 i 個數被分成 j 段;

dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][j];  k 在這裡列舉指的是在前i個數被分成j段的情況下,在1-i中再插入乙個乘號。所以得到dp[k][j-1]*a[k+1][i],【前k個數被分成j-1段】* 【k+1 - i】的數值

先預處理a[i][j] 【i-j段的數值大小】;

#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=1000000;

typedef long long ll;

ll dp[1005][1005];

ll a[1005][1005];

int main()

} for(int i=1;i<=slen;i++)

dp[i][0]=a[1][i]; //邊界情況 沒有*號時區間數值

for(int cnt=1;cnt}

} printf("%lld\n",dp[slen][m-1]);

}}

小胖的疑惑 整數劃分 區間DP

小胖同學 同學是數學優等生,在高中乙個年段中數學總是考第一,楓少同學作為萬年老二 想要超過他,於是楓同學出了道難題給absolute error同學,並且跟他約定了如果absolute error做的出來他就轉學。這題大概是這樣,將整數t分成n份,每份裡面必須有數不能空,且不能有相同的分法 不考慮順...

南陽理工746整數劃分 區間dp

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 問題是我們經常見到的整數劃分,給出兩個整數 n m 要求在 n 中加入m 1 個乘號,將n分成m段,求出這m段的最大乘積 輸入 第一行是乙個整數t,表示有t組測試資料 接下來t行,每行有兩個正整數 n,m 1 n 10 19,0...

區間dp 整數劃分nyoj746

問題是我們經常見到的整數劃分,給出兩個整數 n m 要求在 n 中加入m 1 個乘號,將n分成m段,求出這m段的最大乘積 輸入第一行是乙個整數t,表示有t組測試資料 接下來t行,每行有兩個正整數 n,m 1 n 10 19,0 m n的位數 輸出輸出每組測試樣例結果為乙個整數佔一行 樣例輸入 211...