51nod 1052 最大M子段和
2017-11-17 22:24
417 查看
dp[i]表示把前i个数分成x份的最大和
pre[i]表示把前i个数分成x-1份的最大和
进行m次dp
pre[i]表示把前i个数分成x-1份的最大和
进行m次dp
#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> #include <ctime> #include <bitset> using namespace std; #define pb push_back #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d%d",&n,&m) #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define sld(n) scanf("%lld",&n) #define sldd(n,m) scanf("%lld%lld",&n,&m) #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define sf(n) scanf("%lf",&n) #define sff(n,m) scanf("%lf%lf",&n,&m) #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define ss(str) scanf("%s",str) #define ansn() printf("%d\n",ans) #define lansn() printf("%lld\n",ans) #define r0(i,n) for(int i=0;i<(n);++i) #define r1(i,e) for(int i=1;i<=e;++i) #define rn(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define lowbit(a) (a&(-a)) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define pll pair<long long,long long> #define mp(aa,bb) make_pair(aa,bb) #define lrt rt<<1 #define rrt rt<<1|1 #define X first #define Y second #define PI (acos(-1.0)) typedef long long ll; typedef unsigned long long ull; const ll mod = 1000000000+7; const double eps=1e-9; const int inf=0x3f3f3f3f; //const ll infl = 10000000000000000; const int maxn= 5e3+10; const int maxm = 2e4+10; //Pretests passed int in(ll &ret) { char c; int sgn ; if(c=getchar(),c==EOF)return -1; while(c!='-'&&(c<'0'||c>'9'))c=getchar(); sgn = (c=='-')?-1:1; ret = (c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0'); ret *=sgn; return 1; } ll pre[maxn]; ll dp[maxn]; int num[maxn]; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL int n,m; sdd(n,m); for(int i=1;i<=n;++i)sd(num[i]),dp[i] = -inf; for(int j = 1 ;j<=m;++j) { ll ans = -inf; for(int i=j;i<=n;++i) { dp[i] = max(dp[i-1],pre[i-1]) + num[i]; pre[i-1] = ans; ans = max(ans,dp[i]); } pre = ans; } ll ans = pre ; lansn(); return 0; }
相关文章推荐
- 51nod 1052[最大子段和]【DP】
- 51Nod 1052 最大M子段和
- 51nod 1052 最大m子段和 DP
- 51nod 1052最大M子段和 & poj 2479最大两子段和
- 51nod 1052 最大M子段和 (区间dp)
- 51Nod 1052/1053/1115 最大M子段和V1/V2/V3
- 51nod 1050 循环数组最大子段和
- 51nod 1050 循环数组的最大子段和
- 51nod 1049 最大子段和
- 51nod 1115 最大M子段和 V3 (链表)
- 51nod 1050 循环数组最大子段和 !!!!巧妙
- 51nod 1050 循环数组最大子段和
- 51Nod-1051 最大子矩阵和【最大子段和+DP】
- 51Nod-1049 最大子段和
- 51Nod-最大子段和(动态规划)
- 51nod 1053 最大M子段和 V2 (链表 对经典dp进行优化)
- 【51nod】1049 最大子段和
- 51nod-【循环数组最大子段和】
- 【贪心+优先队列】51Nod 1053 最大M子段和 V2
- 51nod 1050 循环数组最大子段和(思维)