hdu 3905(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3905
思路:dp[i][j]表示前i分钟,睡了j分钟收获的的最大价值,并记tmp_dp[i][j]为从i开始前的连续L分钟都是醒着的,并且睡了j分钟所能得到的最大价值,于是状态转移方程可以表示为:
第 i 分钟睡dp[i][j]=dp[i-1][j-1];
第 i 分钟醒着 dp[i][j]=max{dp[i][j],tmp_dp[i][j]}
而tmp_dp[i][j]的转移方程为tmp_dp[i][j]=max(tmp_dp[i-1][j]+a[i],dp[i-l][j]+sum[i]-sum[i-l]);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int n,m,l; 8 int dp[1111][1111]; 9 int tmp_dp[1111][1111]; 10 int sum[1111],a[1111]; 11 12 int main() 13 { 14 while(~scanf("%d%d%d",&n,&m,&l)){ 15 sum[0]=0; 16 for(int i=1;i<=n;i++){ 17 scanf("%d",&a[i]); 18 sum[i]=sum[i-1]+a[i]; 19 } 20 memset(dp,0,sizeof(dp)); 21 memset(tmp_dp,0,sizeof(tmp_dp)); 22 for(int i=1;i<=n;i++){ 23 for(int j=0;j<=i&&j<=m;j++){ 24 if(j>=1)dp[i][j]=dp[i-1][j-1]; 25 if(i-j>=l){ 26 tmp_dp[i][j]=max(tmp_dp[i-1][j]+a[i],dp[i-l][j]+sum[i]-sum[i-l]); 27 dp[i][j]=max(dp[i][j],tmp_dp[i][j]); 28 } 29 } 30 } 31 printf("%d\n",dp[n][m]); 32 } 33 return 0; 34 }