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

晚上做完百度校招笔试题,真心觉得不再爱了,第一题图片没刷出来,第二题一看就有思路,结果花了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[n];
		int[] v = new int[n];
		int[] p = new int[n];
		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];
	}
}

测试:



其实,你说难吗?真不难! 第一次搞动态规划,主要还是自己能画图一步步推导(http://blog.csdn.net/dapengbusi/article/details/7463968关联文章中的那个图,会画了就okay了!),掌握了,这方法还是很强大的!好吧,笔试又挂了 0.0


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值