Sleeping
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Submission(s): 1820 Accepted Submission(s): 671
璇渣開始補dp Q_Q
n分鐘的課 聽第i分鐘可獲得ai分 睡覺不得分
至少睡m分,每次聽課必須連續>=L 分鐘,求最大得分。
dp[i][j][0] 表示前 i 分鐘睡覺了 j 分鐘而且第 i 分鐘沒有睡覺,dp[i][j][1] 表示前 i 分鐘睡覺了 j 分鐘而且第 i 分鐘在睡覺。則:
dp[i][j][1] = max(dp[i-1][j-1][0], dp[i-1][j-1][1]);
dp[i][j][0] = max(dp[i-L][j][1]+sum[i]-sum[i-L], dp[i-1][j][0]+a[i]);
/** Author: ☆·aosaki(*’(OO)’*) niconiconi★ **/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <list>
#include <stack>
//#include <tuple>
#define mem(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define lp(k,a) for(int k=1;k<=a;k++)
#define lp0(k,a) for(int k=0;k<a;k++)
#define lpn(k,n,a) for(int k=n;k<=a;k++)
#define lpd(k,n,a) for(int k=n;k>=a;k--)
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define lowbit(x) (x&(-x))
#define ll long long
#define pi pair<int,int>
#define vi vector<int>
#define PI acos(-1.0)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define TT cout<<"*****"<<endl;
#define TTT cout<<"********"<<endl;
inline int gcd(int a,int b)
{
return a==0?b:gcd(b%a,a);
}
#define INF 1e9
#define eps 1e-8
#define mod 10007
#define MAX 1002
using namespace std;
int dp[1005][1005][2];
int a[1005],sum[1005];
int main()
{
//freopen("in.txt","r",stdin);
int n,m,L;
while (~scanf("%d%d%d",&n,&m,&L))
{
mem(sum); mem(dp);
lp(i,n)
sc(a[i]);
lp(i,n)
sum[i]=sum[i-1]+a[i];
lp(i,n)
{
if(i>=L)
dp[i][0][0]=sum[i];
for (int j=1;j<=m && j<=i;j++)
{
dp[i][j][1]=max(dp[i-1][j-1][0], dp[i-1][j-1][1]);
if(i-L>=j)
dp[i][j][0]=max(dp[i-L][j][1]+sum[i]-sum[i-L], dp[i-1][j][0]+a[i]);
}
}
printf("%d\n",max(dp[n][m][0],dp[n][m][1]));
}
}