您的位置:首页 > 其它

2015百度校招之动态规划(兼职问题)

2015-09-13 01:47 316 查看
晚上做完百度校招笔试题,真心觉得不再爱了,第一题图片没刷出来,第二题一看就有思路,结果花了20多分钟写代码,可竟然半个多小时调试,还做错了,第三题也是很简单。因为前面的网站高并发导致的各种刷不出图问题,很是影响手感。不吐槽了,动态规划问题,只是这里比普通的动态规划多了层包装。第二题截图如下:



交完卷很不爽,明明可以轻松搞定的题,结果还耽误了另外两道题的答题时间,唉,都怪自己太倔。好吧,不吐槽了,下面贴出交卷后完善的代码:

import java.util.Scanner;

public class Main1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Scanner scan = new Scanner(System.in);
String[] num = scan.nextLine().split("\\s");///n,m,K
int n = Integer.valueOf(num[0]);
int m = Integer.valueOf(num[1]);
int k = Integer.valueOf(num[2]);
int[] c = new int
;
int[] v = new int
;
int[] p = new int
;
String []  pdata = scan.nextLine().split("\\s");
int temp = n;
while(temp>0){
p[temp-1] = Integer.valueOf(pdata[temp-1]);
temp--;
}
////根据m个时间段重新构造获取的报酬数组
for(int i=0;i<n;i++){
int sum = 0;
for(int j=0;j<m&&i>=j;j++){///将i前m个报酬相加
sum+=p[i-j];
}
v[i] = sum;
c[i] = 1;//消耗体力
}

System.out.println(dp(k, m, c, v));

}
/**
* 动态规划获取单组数据的最大价值
* @param k 体力
* @param m 连续工作间隔
* @param c   工作时间段
* @param v   获得的报酬
* @return
*/
public static int dp(int k, int m,int[] c, int[] v){
int[][] dp = new int[c.length][k+1];/////dp[i][j]表示在在体力为j时,选择前面i个所得最大报酬
for(int i=0;i<c.length;i++) {
dp[i][0] = 0;
}
for(int j=0;j<k;j++){
dp[0][j] = 0;
}

for(int i=0;i<c.length;i++){
for(int j=0;j<=k;j++){
if(c[i]>j){///不工作
dp[i][j] = i==0? 0 : dp[i-1][j];
}else{///工作
if(i<m){///前m个时间段
//						for(int x=0;x<i+1;x++)
dp[i][j] =v[i];
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i-m][j-1]+v[i]);
}

}
}
}
if(k<1||c.length<1) return 0;
return dp[c.length-1][k];
}
}


测试:





其实,你说难吗?真不难! 第一次搞动态规划,主要还是自己能画图一步步推导(/article/3665226.html关联文章中的那个图,会画了就okay了!),掌握了,这方法还是很强大的!好吧,笔试又挂了 0.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: