以前喜欢贪心,现在喜欢dp 2333
题意:有一系列的获得硬盘和出售硬盘的动作,获得硬盘可以使你获得价值为2^x的硬盘,你可以选择保有这个硬盘,但你只能保有一个硬盘,在遇到销售动作时可以选择卖出,问最大收益是多少
题解:dp[i] : 考虑到第i个硬盘时最大的收益
转移方程
dp[i]=min(dp[i-1],dp[j]+2^x[j]), 1 <= j < i
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static BigInteger MAX(BigInteger a,BigInteger b){
if (a.compareTo(b)==1) return a;
return b;
}
public static void main(String[] args) {
BigInteger dp[]=new BigInteger[5005];
BigInteger d[]=new BigInteger[2005];
for(int i=0;i<=2000;i++){
if(i==0) d[i]=BigInteger.ONE;
else d[i]=d[i-1].multiply(BigInteger.valueOf(2));
}
int f[]=new int[5005];
int p[]=new int[5005];
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
int n=cin.nextInt();
for(int i=0;i<n;i++){
String s=cin.next();
int x=cin.nextInt();
if(s.charAt(0)=='w') f[i]=0;
else f[i]=1;
p[i]=x;
}
for(int i=0;i<n;i++)
dp[i]=BigInteger.ZERO;
for(int i=1;i<n;i++){
if(f[i]==1){
for(int j=i-1;j>=0;j--){
if(f[j]==0&&p[i]==p[j]) {
dp[i]=MAX(dp[i-1], dp[j].add(d[p[i]]));
break;
}
dp[i]=MAX(dp[i], dp[i-1]);
}
}
else dp[i]=dp[i-1];
}
System.out.println(dp[n-1]);
}
}
}