codeforces 解题报告 987C. Three displays DP 暴力

http://codeforces.com/contest/987/problem/C

解题思路:这一题我深深地感受到了PY的可怕,后附一个女生的PY代码

1.先暴力枚举前两个数的最小和

2.然后暴力枚举前两个数与第三个数的最小和

3.我这是暴力过题,俺也不知道这道题DP在哪

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

public class Main {

    public static void main(String args[]) {

        long[] s = new long[3005];
        long[] c = new long[3005];
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i = 0;i < n;i++) {
            s[i] = sc.nextLong();
        }
        for(int i = 0;i < n;i++) {
            c[i] = sc.nextLong();
        }

        long[] goal = new long[3005];             //以其下标为第二个元素的最小和
        Set<Integer> ve = new HashSet<>();        //能成为第二个元素的元素下标
        for(int i = 0;i < n;i++) {
            for(int j = i + 1;j < n;j++) {
                if(s[j] > s[i]) {
                    if(goal[j] != 0) {            //维护最小和
                        goal[j] = Math.min(goal[j],c[j] + c[i]);
                    } else {
                        ve.add(j);
                        goal[j] = c[j] + c[i];
                    }
                }
            }
        }
        long ans = Long.MAX_VALUE;
        Iterator<Integer> iter = ve.iterator();
        while (iter.hasNext()) {
            int te = iter.next();
            for(int j = te + 1;j < n;j++) {
                if(s[te] < s[j]) {
                    long temp = goal[te] + c[j];
                    ans = Math.min(ans,temp);
                }
            }
        }
        if(ans == Long.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(ans);
        }
    }
}

PY:

n = int(input())
ls1 = [int(i) for i in input().split()]
ls2 = [int(i) for i in input().split()]

ans = -1

for i in range(1, n - 1):
    l = [ls2[j] for j in range(0, i) if ls1[j] < ls1[i]]
    r = [ls2[j] for j in range(i+1, n) if ls1[j] > ls1[i]]

    if len(l) and len(r):
        ans = min(l) + min(r) + ls2[i] if ans == -1 else min(ans, min(l) + min(r) + ls2[i])

print(ans)
PS:这让我不禁产生转战PY的念头


猜你喜欢

转载自blog.csdn.net/a912952381/article/details/81066513