HW数的最大价值

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            // int b = in.nextInt();
            
            int[] position=new  int[a];
            int[] raids=new  int[a];
            int[] value=new  int[a];
            for(int i=0;i<a;i++){
                position[i]=in.nextInt();
            }
            for(int i=0;i<a;i++){
                raids[i]=in.nextInt();
            }
            for(int i=0;i<a;i++){
                value[i]=in.nextInt();
            }
            int res=subfunc(position,raids,value);
            System.out.println(res);
        }
    }
    //把value和radis做一个map, 通过某一个区间,直接可以获取value的值
    // 种树
    public static int subfunc(int[]position,int[] radis,int[] value ){
        int len=position.length;
        int[][] data=new int[len][2];
        for(int i=0;i<len;i++){
            data[i][0]=position[i]-radis[i];
            data[i][1]=position[i]+radis[i];
            // System.out.println(data[i][0]);
        }
        int temp=data[0][1];
        for(int i=0;i<len;i++){
            temp=Math.max(temp,data[i][1]);
        }
        //找出所有的不重叠区间
        int maxvalue=0;
        int[][] dp=new int[len+1][temp+1];
        for(int i=0;i<=len;i++){
            dp[i][0]=0;
        }
        for(int i=0;i<=temp;i++){
            dp[0][i]=0;
        }
        int lastright=0;
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int i=0;i<len;i++){
            map.put(position[i],value[i]);
        }
        // Arrays.sort(data, (e1, e2) -> (e1[0] - e2[0])); 
        Arrays.sort(data,(a,b)->(a[0]-b[0]));
        for(int i=1;i<=len;i++){
            // System.out.println(temp);
            for(int j=1;j<=temp;j++){
                if(data[i-1][0]<lastright){//这个不满足条件 不选
                    // System.out.println(i-1);
                    dp[i][j]=dp[i-1][j];
                    // int thlue=map.get((data[i-1][0]+data[i-1][1])/2);
                    // System.out.println(thlue);
                }
                else{
                    int thisvalue=map.get((data[i-1][0]+data[i-1][1])/2);
                    int thisradis=(data[i-1][1]-data[i-1][0])/2;
                    // System.out.println(thisvalue);
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-thisradis]+thisvalue);
                    if(dp[i][j]==dp[i-1][j]+thisvalue){//选了
                        lastright=data[i-1][1];
                        // System.out.println(lastright);
                    }
                    // System.out.println(data[i-1][0]);
                }
                maxvalue=Math.max(maxvalue,dp[i][j]);
                System.out.println(i);
                System.out.println(j);
                System.out.println(dp[i][j]);
                
            }
           
        }
        return maxvalue;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值