昨晚链家笔试第一题,食品那题,代码

开始用贪心就过了27%,后来考虑首尾数值相等的情况还是27%,所以想着换动态规划,然而当时递推式写错了,初始值错了,后面也有小错误,导致一直不对,今天早上写了下,样例是对的,找不到测试的地方不知道能不能AC。
原题:
动态规划:dp[i][j]表示0到i-1和n-1到j+1的食物都买出后,从第i个开始到第j个食物能获得的最大价值。
dp[i][j] = max{dp[i][j-1]+cnt*a[j] , dp[i+1][j]+cnt*a[i])             cnt = n - (j-i), j > i
dp[i][i] = n*a[i], 从上面的递推式其实就能推出初值的表达式,但是当时虽然写了动态规划但是对dp[i][j]
的实际含义不是很透彻,所以写错了。
代码:
import java.util.*;
public class Main{
	public static void main(String[] arg){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] a = new int[n];
		for(int i = 0; i < n; ++i){
			a[i] = sc.nextInt();
		}
		int[][] dp = new int[n][n];
		for(int i = 0; i < n; ++i){
			dp[i][i] = n*a[i];
		}
		for(int l = 1; l <= n-1; ++l){
			for(int i = 0; i + l < n; ++i){
				int j = i + l;
				int cnt = n - (j-i);
				dp[i][j] = Math.max(dp[i+1][j] + cnt*a[i], dp[i][j-1]+cnt*a[j]);
			}
		}
		System.out.println(dp[0][n-1]);
	}
}

#算法工程师#
全部评论
贪心不对
点赞 回复 分享
发布于 2017-09-03 11:25
直接排序从小到大依次卖就好了
点赞 回复 分享
发布于 2017-09-03 11:54
拿大或者拿小的问题
点赞 回复 分享
发布于 2017-09-03 13:11
直接dp能过55%,用map剪枝一下过了91%,想用数组存储来剪枝但是没有想到好的算不冲突索引的方法。然后就结束了。 想知道第二题那个歌曲排列的用什么策略。
点赞 回复 分享
发布于 2017-09-03 13:29
动态规划 http://http://bestmind.space/
点赞 回复 分享
发布于 2017-09-03 14:24
大神 膜拜
点赞 回复 分享
发布于 2017-09-03 14:45
是我没理解题意?用一个deque不能解决问题? #include<iostream> #include<deque> using namespace std; int MaxValue(deque<int> queue) { int sum=0; int price=1; while(!queue.empty()) { int start=queue.front(); int end=queue.back(); if(start<end) { queue.pop_front(); sum+=price*start; } else { queue.pop_back(); sum+=price*end; } price++; } return sum; } int main() { int num; cin>>num; int i=0; int tmp; deque<int> queue; while(i<num) { cin>>tmp; queue.push_back(tmp); i++; } int ret=MaxValue(queue); cout<<ret<<endl; //system("pause"); return 0; }
点赞 回复 分享
发布于 2017-09-03 15:59
链家这是内推还是秋招啊?
点赞 回复 分享
发布于 2017-09-03 16:12
 这道题目挺好,我也写了一份代码   http://www.cnblogs.com/pk28/p/7470030.html   
点赞 回复 分享
发布于 2017-09-03 17:11
/**     http://bestmind.space/posts/%E9%93%BE%E5%AE%B62018%E9%93%BE%E4%B9%A0%E7%94%9F%E6%8B%9B%E8%81%98%E8%80%83%E8%AF%95-%E7%BC%96%E7%A8%8B%E9%A2%98%E4%B8%89/     链家笔试第一题,食品那题     分析:使用动态规划         1.定义dp(i,j),表示除了编号从i到j的食物,剩下卖出的最大值。         2.状态转移方程为:             dp(i,j) = Max{dp(i-1,j)+cost(i-1), dp(i,j+1)+cost(j+1)}             dp(i-1,j)+cost(i-1):除了(i-1,j)卖出的最大值加上卖出第(i-1)的价值。             dp(i,j+1)+cost(j+1):除了(i,j+1)卖出的最大值加上卖出第(j+1)的价值。         3.空间复杂度O(n*n)可以优化为O(n)。 */ int n, v[2002], dp[2002], maxIncome; int main() {     memset(dp, 0, sizeof dp);     maxIncome = 0;     cin >> n;     // 数组下标从1开始     v[0] = v[n+1] = 0;     for(int i = 1; i <= n; i++)         cin >> v[i];     // 从右往左dp     for(int i = 1; i <= n; i++) {         int day = i - 1;         // 求出dp[i, n~i]         for(int j = n; j >= i; j--) {             dp[j] = max(dp[j] + v[i-1]*day, dp[j+1] + v[j+1]*day);             day++;         }         // 上面计算得到的dp[i],表示的是除了第i个食物所得到的最大值,         // 因此还需选上第i个食物, 即最后一个选的是i         maxIncome = max(maxIncome, dp[i] + v[i]*n);     }     cout << maxIncome;     return 0; }
点赞 回复 分享
发布于 2018-03-25 10:26
这个题目说的是从头或者尾去取数据,那就在每一天比较头尾的元素大小,取出小的元素不就ok了吗?难道是我理解的不对吗?
点赞 回复 分享
发布于 2018-03-31 12:36

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务