第十六届文远知行杯I题V字钩爪

题目链接:I-V字钩爪_文远知行杯广东工业大学第十六届程序设计竞赛 (nowcoder.com)

注意理解题目,当时做题题目理解有误

一个dp题,对我来说还是有些难度的

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.List;

public class MainV字钩爪 {
	//本题的题意我理解有误,把宝石取走不会补位
	//所以这个时候就可以分组,很显然会相互影响到的归为一组,而i+k,i+2k,i+3k.....显然为一组
	//而后求出每组最大即可
	//求出每组最大显然使用dp求解
	//这一位取还是不取,0表示不取,1表示取
	public static void main(String[] args) throws IOException {
		StreamTokenizer x = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		x.nextToken();
		int n=(int)x.nval;
		x.nextToken();
		int m=(int)x.nval;
		int aa[]=new int[n];
		for(int i=0;i<n;i++) {
			x.nextToken();
			aa[i]=(int)x.nval;
		}
		long sum=0;
		for(int i=0;i<m;i++) {//可以分为m组
			List<Integer> a=new LinkedList<Integer>();
			//a.add(0);
			for(int j=i;j<n;j+=m)//分组
				a.add(aa[j]);
			sum+=dfx(a);
		}
		out.println(sum);
		out.flush();
	}
	public static long dfx(List<Integer> a) {
		int n=a.size();
		long dp[][]=new long[n][2];//两位表示取还是不取
		for(int i=1;i<n;i++) {
			dp[i][0]=Math.max(dp[i-1][0], dp[i-1][1]);//如果不取那这一位就是前一位的最大
			dp[i][1]=dp[i-1][0]+a.get(i)+a.get(i-1);//如果取,那前一位不取,那就是前一位加上本位
		}
		return Math.max(dp[n-1][1], dp[n-1][0]);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值