获赞
77
粉丝
22
关注
7
看过 TA
110
同济大学
2022
C++
IP属地:广东
暂未填写个人简介
私信
关注
2020-07-28 10:28
已编辑
上海华为技术有限公司_软件开发
两道题都是结束以后才想出来。。。两题都只过了20%,哭了。 第一题应该是只有当所有数字都出现偶数次时候第二个人才能赢,其他情况都是第一个人赢。 第二题我以为是只能取每一层的一头一尾两个,写了一个dp,只过了20%,结束以后我发现数据给的n和c最大为100,m最大为10000,说明如果m >= n * c,所有物品都可以拿走,所以每一层如果已经拿了第1个和第c个,那就还可以继续拿第2个和第c-1个。 个人觉得是个背包dp,然后时间不够呀!!! 好气!结束了才想到。 (代码有问题。。。不好意思,我删掉重写) 昨晚躺在床上突然发现之前这样子贪心找到...
fee-feng:public static void main(String[] args){ int n,m,c; n=sc.nextInt(); m=sc.nextInt(); for(int i=0 ; i<n ; i++ ){ int sum=0;// 求该层的物品价值总和 c=sc.nextInt(); for(int j=0 ; j<c ; j++ ){ a[j] = sc.nextInt(); sum+=a[j]; } Arrays.fill(val,0); for(int k=1 ; k<=c ; k++){ // 当前层获得k件物品可得的最大值存入val int index= 0 , now = 0;// 滑动窗口,窗口大小为c-k while(index < c-k)// 初始窗口 从第一个开始累加 now +=a[index++]; val[k] = Math.max(val[k],sum-now); while(index<c){ // 开始往右边移动 now+= a[index]; now-=a[index-(c-k)]; val[k] = Math.max(val[k],sum-now); //求的是窗口以外的数和最大值 index++; } } // 此时该层的val已经求出 01背包求解 for(int j=m ; j>0 ; j--){ for(int k=1 ; k<= Math.min(j,c) ; j++ ) dp[j] = Math.max(dp[j],dp[j-k]+val[k]); } } System.out.println(dp[m]); }
投递阿里巴巴等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务