标签:main 包含 多少 index 选择 ann math 分组 str
原创
原题:http://lx.lanqiao.cn/problem.page?gpid=T454
动态规划解题,先将数据分组,彼此相差K的数据为一组,这样组与组之间的数据不会受到影响,
只要从每组中选择出最大在线人数,累加起来即可。
每个数据只能有选择与不选择两种可能,设dp[i-1]存储前i-1个数据(包括第i-1个数据)中能选择的最大人数,则选择
第i个数据后dp[i]=dp[i-2]+value[i],不选择dp[i]=dp[i-1](因为不选择你只能继承),所以得出状态转移方程:
dp[i]=max[dp[i-2]+value[i],dp[i-1]);
K=0时特别处理!
Java AC
1 import java.util.*; 2 3 public class Main { 4 5 static int N; 6 static int K; 7 8 public static void main(String[] args) { 9 Scanner reader=new Scanner(System.in); 10 N=reader.nextInt(); 11 K=reader.nextInt(); 12 int result=0; 13 int score[]=new int[100005]; 14 int dp[]=new int[100005]; 15 int max=0; 16 for(int i=0;i<N;i++) { 17 int temp=reader.nextInt(); 18 if(temp>max) { 19 max=temp; 20 } 21 score[temp]++; 22 } 23 if(K==0) { 24 for(int i=0;i<=max;i++) { 25 if(score[i]!=0) { 26 result++; 27 } 28 } 29 System.out.println(result); 30 return; 31 } 32 int value[]=new int[100005]; 33 for(int i=0;i<K;i++) { 34 int index; 35 index=0; 36 for(int j=i;j<=max;j+=K) { 37 value[index]=score[j]; 38 index++; 39 } 40 dp[0]=value[0]; 41 dp[1]=dp[0]>value[1]?dp[0]:value[1]; 42 for(int z=2;z<index;z++) { 43 dp[z]=Math.max(dp[z-2]+value[z], dp[z-1]); 44 } 45 result+=dp[index-1]; 46 } 47 System.out.println(result); 48 } 49 50 }
15:53:41
2018-08-26
标签:main 包含 多少 index 选择 ann math 分组 str
原文地址:https://www.cnblogs.com/chiweiming/p/9537628.html