题目链接: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]);
}
}