hdu 1864 实数离散化+动态规划+滚动数组

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <stack>
#include <set>
#include <map>
#include <vector>

using namespace std;
#define INF 0x2fffffff
#define LL long long
#define MAX(a,b) ((a)>(b))?(a):(b)
#define MIN(a,b) ((a)<(b))?(a):(b)
double q;
int n;
double val[100][26];
int v[100];
int dp[3000050];
int flag[100];

int main(){
    while(scanf("%lf %d",&q,&n),n){
        int m;
        memset(val,0,sizeof(val));
        for(int i = 0;i < n;i++){
            scanf("%d",&m);
            for(int j = 0;j < m;j++){
                char ch;
                double v;
                scanf(" %c:%lf",&ch,&v);
                val[i][ch-‘A‘] += v;
            }
        }
        memset(flag,0,sizeof(flag));
        for(int i = 0;i < n;i++){
            double sum = 0;
            for(int j = 0;j < 26;j++){
                if(val[i][j] > 600){
                    flag[i] = 1;
                }
                if(j >= 3 && val[i][j]) flag[i] = 1;
                sum += val[i][j];
            }
            if(sum > 1000){
                flag[i]= 1;
            }
        }
        int g = 1;
        int tt= 0;
        for(int i = 0;i < n;i++){
            if(!flag[i]){
                double sum = 0;
                for(int j = 0;j < 3;j++){
                    sum += val[i][j];
                }
                v[g] = sum*100;
                tt += v[g++];
            }
        }
        memset(dp,0,sizeof(dp));
        int cc = min(tt,(int)(q*100));
        for(int i = 1;i < g;i++){
            for(int j = cc;j >= v[i];j--){
                dp[j] = max(dp[j],dp[j-v[i]]+v[i]);
            }
        }
        printf("%.2lf\n",dp[cc]/100.0);
    }
    return 0;

}

离散化如果不加上滚动数组的话就会爆内存

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 09:54:59

hdu 1864 实数离散化+动态规划+滚动数组的相关文章

POJ2442——Squence(二叉堆+动态规划 | 滚动数组)

本文出自:http://blog.csdn.net/svitter 题意分析: Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can

HDU - 2294 Pendant (DP滚动数组降维+矩阵快速幂)

Description On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K kind of pearls. The pendant is actually a string of pearls, and its length is defined as the number of pearls in it. As is known to all, Ale

动态规划+滚动数组 -- POJ 1159 Palindrome

给一字符串,问最少加几个字符可以让它成为回文串, 比如 Ab3bd 最少需要两个字符可以成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几个字符,枚举子串长. if str[i] == str[j]: DP[i][j] = DP[i + 1][j - 1] else: DP[i][j] = min( DP[i + 1][j], DP[i][j - 1] ) + 1 注意: 长度较大为 5000,二维数组 5000 * 5000 需要将

【动态规划+滚动数组】Interleaving String

题目:leetcode Interleaving String Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aadbbcbcac", return true. When s3 = "aadbbbaccc&quo

HDU-10240Max Sum Plus Plus+动态规划+滚动数组

Max Sum Plus Plus 题意:题意理解了老半天,这里是说在给定数列中,取m组子数列,不能有重复,使得这些子序列的和最大: 就比如m=2时候,1 /2/-4/5/6.可以不用拿-4的意思: 思路:这道题的思路是动态规划,递推: 状态dp[i][j] 表示有前j个数,组成i组的和的最大值. 决策: 第j个数,要么包含在第i组里面,要么自己独立成组. 其中最后一组包含a[j].(这很关键) 则状态转移方程为:(在二维图中,就是要么从左边取,要么取上一行的最大值,下式中,左边max是包含在第

HDU 5101 Select --离散化+树状数组

题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数. 解法:n * Cnt[n] <= 1000*100 = 100000, 即最多10^5个人,所以枚举每个值x,求他的后面那些组中有多少数大于 k-x即可, 求有多少数大于k-x可以先求有多少数小于等于k-x,然后总数减一下即可. 可以用树状数组求. 先把所有数离散地存入一个树状数组中,然后每次枚举完一组的数后,将这组的数去掉. 代码: #include <iostream> #include <cst

HDU 5862(离散化+树状数组)

Problem Counting Intersections 题目大意 给定n条水平或竖直的线段,统计所有线段的交点个数. (n<=100000) 解题分析 首先将线段离散化. 然后将所有线段按照横坐标的顺序,按照先插入再查找再删除的顺序进行操作. 对于横线 如果是左端点,则将其纵坐标加1,右端点则减1,对于竖线直接求和就行了. 参考程序 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include

[TYVJ1061] Mobile Service|动态规划|滚动数组

P1061 Mobile Service 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.被请求后,他才能移动,不允许在同样的位置出现两个员工.从p到q移动一个员工,需要花费c(p,q).这个函数没有必要对称,但是c(p,p)=0.公司必须满足所有的请求.目标是最小化公司花费. 输入格式 第一行有两个整数L,N(3<=L<=

HDU 5389 Zero Escape(DP + 滚动数组)

Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 864    Accepted Submission(s): 438 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchik