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的念头