codeforces 18D Seller Bob DP

题意:按顺序你能够获得一些价值为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]);
        }
    }
}
时间: 2024-10-12 07:55:46

codeforces 18D Seller Bob DP的相关文章

Codeforces 18D Seller Bob java大数+贪心

题目链接:点击打开链接 java: import java.math.BigInteger; import java.util.Scanner; public class Main { static int N = 5005; static BigInteger[] er = new BigInteger[N]; static BigInteger E = new BigInteger("2"); static int[] a = new int[N]; static int[] ma

Codeforces 18D Seller Bob &amp;&amp; 18E Flag 2 简单dp

D题很恶心的要用大数. dp[i] 表示到第 i 条信息的最大收益. 显然,dp[1]  = 0. 对于i > 1有,若当前信息为 win x,那么显然有dp[i] = dp[i-1]. 若当前信息为sell x,那么dp[i] = max(dp[i-1] , dp[j] + 2^x),j 需满足j < i && 第j条信息为 win y && y == x. import java.util.Scanner; import java.math.BigInteg

CodeForces 18E Flag 2 dp

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

Codeforces 41D Pawn 简单dp

题目链接:点击打开链接 给定n*m 的矩阵 常数k 下面一个n*m的矩阵,每个位置由 0-9的一个整数表示 问: 从最后一行开始向上走到第一行使得路径上的和 % (k+1) == 0 每个格子只能向或走一步 求:最大的路径和 最后一行的哪个位置作为起点 从下到上的路径 思路: 简单dp #include <cstdio> #include <algorithm> #include<iostream> #include<string.h> #include &

CodeForces 19B Checkout Assistant dp

题目链接:点击打开链接 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <set> #include <math.h> using namespace std; #define inf 115292150460684697

Neko and Aki&#39;s Prank CodeForces - 1152D (括号序列,dp)

大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化为求奇数层结点数. 然后就dp求出前$i$为'('比')'多j个的方案数, 奇数层且合法的时候统计一下贡献即可. #include <iostream> #include <iostream> #include <algorithm> #include <cstdio

codeforces 148D 【概率dp】

题目链接: codeforces 148D Bag of mice 题意:一个包里面有w只白老鼠和b只黑老鼠,公主与龙依次从包中拿老鼠,每次取一只,当龙拿时还会从包中溜走一只,先拿到老鼠的获胜,当背包中没老鼠时且之前没人拿到白老鼠则龙获胜,问公主获胜的概率是多少. 题解: 设dp[i][j]为背包中有i只白老鼠j只黑老鼠时公主获胜的概率 则公主获胜的情况分成三种: 1.直接拿到白老鼠 p1=i/(i+j) 2.公主拿到黑老鼠,龙拿到黑老鼠,逃跑一只黑老鼠 p2=(j/(i+j)) ((j-1)/

[Codeforces 1295F]Good Contest(DP+组合数学)

[Codeforces 1295F]Good Contest(DP+组合数学) 题面 有一个长度为\(n\)的整数序列,第\(i\)个数的值在\([l_i,r_i]\)中随机产生.问这个序列是一个不上升序列的概率(模\(998244353\)意义下). \(n \leq 50,l_i,r_i \leq 998244351\) 分析 和[APIO2016]划艇几乎一模一样.可惜比赛的时候时间不够. 首先把问题转化成求最长不上升序列的数量. 我们把这些区间离散化,分割成两两之间不互相覆盖的若干个区间

Educational Codeforces Round 26 D dp,思维

Educational Codeforces Round 26 D. Round Subset 题意:有 n 个数,从中选出 k 个数,要使这 k 个数的乘积末尾的 0 的数量最多. tags:dp好题 dp[i][j][l] 表示前 i 个数,选取了其中 j 个数,分解因子后有 l 个 5时,最多有多少个 2 .i 这一维明显可以省略. 这题一开始有个地方写挫了..选取 j 个数时,应该反着来,即 for( j, k, 1) ,不是 for( j, 1, k) ,不然会多算. #include