hduOJ2084数塔-简单DP Java实现

用一个数组存储当前行由上到下得到的最大值, 注意:每往下进行一列需要用一个pre数组暂存上一行的数组的各值。
注意java下list列表更新元素用set()方法,并且暂存数组时不能直接赋值pre = ans; 因为java列表下面直接赋值的是地址(引用),
相当于还是对原数组操作,起不到效果。


另外需要注意的就是 赋值前要清空pre数组,


每一组case读入前 也要清空 ans数组。


最后用集合工具类 Collections对列表求最大值。


强制自己使用Java集合采用列表,其实完全可以用数组实现,数组处理起来没那么复杂。



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;




public class Main
{
    public static void Cpoy(ArrayList<Integer> a, ArrayList<Integer> b)//静态方法,用来转存pre数组,此为值传递
    {
        for(int i=0; i<b.size(); ++i)
            a.add(b.get(i));
    }


    public static void main(String[] args) throws IOException
    {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(stdin.readLine());
        ArrayList<Integer> ans = new ArrayList<>();
        ArrayList<Integer> pre = new ArrayList<>();
        for(int k=0; k<t; ++k)
        {
            ans.clear();//每进行一组case测试前,结果数组清空
            int n = Integer.parseInt(stdin.readLine());
            ans.add(Integer.parseInt(stdin.readLine()));
            for(int i=1; i<n; ++i)
            {
                ans.add(0);
//                pre = ans;//把列表ans的内容复制给pre列表, 不能直接这样复制,因为引用的传递而不起效果。
                pre.clear();//暂存数组先清空
                Cpoy(pre, ans);
                String[] mid = stdin.readLine().split(" ");
                ans.set(0,pre.get(0)+Integer.parseInt(mid[0]));//第一个元素和最后一个元素没得选,只能从上加下来
                for(int j=1; j<i; ++j)
                {
                    int temp = Math.max(pre.get(j-1), pre.get(j));
                    ans.set(j, temp+Integer.parseInt(mid[j]));
                }
                ans.set(i, pre.get(i-1)+Integer.parseInt(mid[i]));//最后一个元素没得选,只能从上加下来
//                System.out.println(ans);
            }
            System.out.println(Collections.max(ans));//用Collections下的max求列表最大值
        }
    }
}
/*
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

*/


下面简单介绍一下 Collections工具类

排序操作

Collections提供以下方法对List进行排序操作

void reverse(List list):反转

void shuffle(List list),随机排序

void sort(List list),按自然排序的升序排序

void sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑

void swap(List list, int i , int j),交换两个索引位置的元素

void rotate(List list, int distance),旋转。当distance为正数时,将list后distance个元素整体移到前面。

                        当distance为负数时,将 list的前distance个元素整体移到后面。



查找,替换操作

int binarySearch(List list, Object key), 对List进行二分查找,返回索引,注意List必须是有序的

int max(Collection coll),根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)

int max(Collection coll, Comparator c),根据定制排序,返回最大元素,排序规则由Comparatator类控制。

                                                类比int min(Collection coll, Comparator c)

void fill(List list, Object obj),用元素obj填充list中所有元素

int frequency(Collection c, Object o),统计元素出现次数

int indexOfSubList(List list, List target), 统计targe在list中第一次出现的索引,找不到则返回-1,

                                                   类比int lastIndexOfSubList(List source, list target).

boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素。



猜你喜欢

转载自blog.csdn.net/m0_38024592/article/details/79905303