网站大量收购闲置独家精品文档,联系QQ:2885784924

109、艰苦打工的小蓝2.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

解题思路

对于环形dp一类的问题,我们有二种解决的方法,一种为?强制连接,另一种为?倍长区间,这里我们用?强制连接?的方式解题。

状态设计及初始化

设]dp[i][j][0/1]?表示当前在?ii?号仓库,已经连续在?j?个仓库工作过,0?表示当前在工厂工作,11?表示当前不在仓库工作。

初始值dp[1][0][0]=dp[1][1][1]=0,其他为?-\inf?inf。

基础转移方程

我们需要从?22?种不同角度考虑dp思路,因此最基础的便是考虑所有仓库是一条直线的方程。即:dp[i][j][0]=max{dp[i?1][j][0],dp[i?1][j][1]}

dp[i][j][1]=max{dp[i?1][j?1][0],dp[i?1][j?1][1]+u[i]}对于不在当前仓库工作,我们可以选择和之前一样继续不工作,或者从之前工作的状态结束。

对于在当前仓库工作,我可以选择从之前不工作转移而来(注意没有酬劳),或者从之前工作状态转移而来。

注意,我们这里选择的是非连续的,所以从小到大枚举即可。

最终结果为max{dp[n][m][0],dp[n][m][1]}。

二次DP转移方程

因为我们这里要强制连接,所有我们在?二次DP,我们的初始化为?dp[1][1][1]=u[1],dp[1][0][0]=0,其余为?-inf。因为这里我们强制连接?nn?号仓库与?11?号仓库。

为什么这样可行呢,因为我们可以选取非连续的部分,也就是说如果我们想选n?1~2,结果便是?n?1~n+n~1+1~2,我们只要把n~1?强制连接在一起即可。

状态转移和?一次DP?一样。

最终答案

此时最终结果为?dp[n][b][1]?与?第一次dp?结果的最大值。

时间复杂度为?O(2?n?m)。

AC_Code

C++

#includebits/stdc++.h

usingnamespacestd;

intdp[2010][2010][2],n,b,u[2010],ans;

intmain(){

scanf(%d%d,n,b);

for(inti=1;i=n;i++)scanf(%d,u+i);

memset(dp,-0x3f,sizeof(dp));

dp[1][1][1]=dp[1][0][0]=0;

for(inti=2;i=n;i++){

dp[i][0][0]=dp[i-1][0][0];

for(intj=1;j=b;j++){

dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);

dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]+u[i]);

}

}

ans=max(dp[n][b][0],dp[n][b][1]);

memset(dp,-0x3f,sizeof(dp));

dp[1][1][1]=u[1];

dp[1][0][0]=0;

for(inti=2;i=n;i++){

dp[i][0][0]=dp[i-1][0][0];

for(intj=1;j=b;j++){

dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);

dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]+u[i]);

}

}

ans=max(ans,dp[n][b][1]);

printf(%d\n,ans);

return0;

}

Java

importjava.util.Scanner;

publicclassMain{

publicstaticvoidmain(String[]args){

Scannerscanner=newScanner(System.in);

intn=scanner.nextInt();

intb=scanner.nextInt();

int[]u=newint[n+1];

for(inti=1;i=n;i++){

u[i]=scanner.nextInt();

}

int[][][]dp=newint

文档评论(0)

如此醉 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档