poj 3666 Making the Grade

来源:互联网 发布:博客打水软件 编辑:程序博客网 时间:2024/05/19 18:15

DP 有点难想,第一个要想到的是最终的结果必然是给定数字的一个子集

然后转化为求原数组的一个子集。由于原数组无序,没法求。所以排序后做DP

dp[i][j]是前i个数由排序后的数组中的前j个(不一定j个都用,但是第j个最大了) 组成时的最小值

dp[i][j] = min( min(dp[i-1][0]...dp[i-1][j]) + abs(arr2[j] - arr[i]); 可转化成一维数组

被屠。。。日

import java.io.*;import java.util.*;class problem2{                                                              int n;    int arr[];    int arr2[];    int dp[];    void solver() throws IOException{                   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));                StringTokenizer st = new StringTokenizer(reader.readLine());        n = Integer.valueOf(st.nextToken());        arr = new int[n];        arr2 = new int[n];        dp = new int[n];        for(int i=0;i<n;i++){            st = new StringTokenizer(reader.readLine());            arr[i] = Integer.valueOf(st.nextToken());            arr2[i] = arr[i];        }        Arrays.sort(arr2);        for(int i=0;i<n;i++){            dp[i] = Math.abs(arr2[i]-arr[0]);        }        int min = Integer.MAX_VALUE;        for(int i=1;i<n;i++){            int tmp_min = Integer.MAX_VALUE;            for(int j=0;j<n;j++){                tmp_min = Math.min(tmp_min, dp[j]);                dp[j] = tmp_min + Math.abs(arr2[j]-arr[i]);            }        }        for(int i=0;i<n;i++){            if(dp[i]<min) min = dp[i];        }        System.out.println(min);    }}                                                                          public class tour  {                                    public static void main (String [] args) throws Exception {        problem2 p = new problem2();        p.solver();    }                                                                                          }      


0 0
原创粉丝点击