codeforces 18d dp

以前喜欢贪心,现在喜欢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]);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86569403