題意:給你乙個大數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...