要求: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...