HDU 1024 簡單dp 滾動陣列 字首和

2021-08-30 06:47:38 字數 1273 閱讀 8256

要求:n個數分為m個不相交的區間,求m個區間內所有數的和。

方法:動態規劃裸題 滾動陣列

1.根據題意,dp[i][j]表示前j個數分為i組且用了第j個數的最大值。

第j個數要麼是加入第i個組(隱藏含義是加入第j-1個數的組)或者自成第i組,

故dp[i][j]=max(i-1<=k<=j-1)}。

2.要求dp[i][j],需先求出dp[i][j-1],max(i-1<=k<=j-1),由於i、i-1和i都有關係,因此dp[i][j]可降維至dp[j],

直接儲存了dp[i][j-1],用pre[j-1]儲存max(i-1<=k<=j-1),pre[j-1]用字首和的方法求。

3.這個題其實是用了字首和之類的方法降低了時間複雜度,並用了滾動陣列降低了空間複雜度。

4.滾動陣列只是降低了空間複雜度,沒有降低時間複雜度。

5.用long long不要用int

#include#include#include#includeusing namespace std;

//dp[i][j]表示用了第j個數 前j個數分為i組的方案數

//第j個數要麼加到原本的最後一組 或者自成一組

//dp[i][j]=max(dp[i][j-1],dp[i-1][j-1])+s[j]

int i,j,k,m,n;

long long max1,s[1000005];

long long dp[1000005],pre[1000005],sum[1000005];

int main()

memset(dp,0,sizeof(dp));

memset(pre,0,sizeof(pre));

//第j個數要麼加到原本的最後一組 或者自成一組

//pre[j]表示前j個數分為i-1組

//dp[i][j]=max(dp[i][j-1],dp[i-1][k])+s[j]

//初始化

dp[1]=s[1];

for(j=2;j<=n;j++)

dp[j]=max(dp[j-1]+s[j],s[j]);

max1=-1e12;

for(k=1;k<=n;k++)

for(i=2;i<=m;i++)//i組

max1=-1e12;

for(k=i;k<=n;k++)

} max1=-1e12;

for(i=m;i<=n;i++)

printf("%lld\n",max1);

} }

HDU 1024 簡單dp 滾動陣列

要求 n個正數組成的序列,整數範圍 32768 s 32767,1 n 1,000,000,挑出m個無交集的連續子串行使這些序列和最大,並輸出最大值。方法 二維dp 滾動陣列降維。1.dp i j 表示第乙個數到下標為j的數挑出i個連續子串行組成的最大值。2.dp i j max dp i j 1 ...

hdu 1024 滾動陣列優化

本題的大致意思為給定乙個陣列,求其分成 m個不相交子段和最大值的問題。解題思路 dp i j 表示前j個數分成i組,且j在第i組裡的最大值。dp i j max,前乙個表示j與j 1在i組裡,後乙個表示j單獨成組。但這道題的n很大,空間複雜度太高,所以要用滾動陣列。max dp i 1 k 就是上一...

hdu 1024(滾動陣列的學習)

學習了一下滾動陣列,dp中經常卡記憶體,而利用滾動陣列可以大大節省記憶體空間,不錯哦。1 include2 include3 include4 const int n 1000010 5 const int inf 1000000000 6 using namespace std 78 inta n...