题意:按顺序你能够获得一些价值为2^x的硬盘,你可以保留一个并且在之后卖掉,但是你在卖之前不可以保留其他硬盘,求最大收益
思路:dp[i]=min(dp[i-1],dp[j]+2^x[j])
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]); } } }