Codeforces Round #267 Div2 C George and Job --DP
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #267 Div2 C George and Job --DP
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:把長度為n的序列分成k個(gè)m長的連續(xù)小序列,這些連續(xù)小序列的和最大是多少。
解法:顯然DP。
定義: dp[i][j] 為前 i 個(gè)元素分成j個(gè)m端,且 i 是第j個(gè)的末尾的最大和。
那么有: dp[i][j] = max(dp[i-1][j], dp[i-m][j-1]+sum[i]-sum[i-m])
5000*5000的空間,是有點(diǎn)大。。
代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #define lll __int64 using namespace std;lll dp[5002][5001]; lll a[5002],sum[5003];int main() {int n,m,k;int i,j;while(scanf("%d%d%d",&n,&m,&k)!=EOF){sum[0] = 0;for(i=1;i<=n;i++){scanf("%I64d",&a[i]);sum[i] = sum[i-1]+a[i];}for(i=0;i<=n;i++)for(j=0;j<=k;j++)dp[i][j] = 0;for(i=m;i<=n;i++){dp[i][0] = max(dp[i][0],dp[i-1][0]);for(j=1;j<=k;j++){dp[i][j] = max(dp[i][j],dp[i-1][j]);dp[i][j] = max(dp[i][j],dp[i-m][j-1]+sum[i]-sum[i-m]);}}cout<<dp[n][k]<<endl;}return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/whatbeg/p/3980745.html
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #267 Div2 C George and Job --DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ●样式表
- 下一篇: WEB安全:XSS漏洞与SQL注入漏洞介