poj 1821 分类: poj 2015-0...

本文介绍了一种通过优化转移方程并调整决策顺序来提高动态规划算法效率的方法。通过对转移方程进行优化,可以有效减少计算量,提高算法性能。文章详细展示了算法的具体实现过程,包括初始化、读取输入数据、排序、动态规划状态转移等关键步骤。

把转移方程优化一下,改变决策顺序就行了。。。


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <string>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <utility>
#include <iostream>
#include <algorithm>

template<class Num>void read(Num &x)
{
    char c; int flag = 1;
    while((c = getchar()) < '0' || c > '9')
        if(c == '-') flag *= -1;
    x = c - '0';
    while((c = getchar()) >= '0' && c <= '9')
        x = (x<<3) + (x<<1) + (c-'0');
    x *= flag;
    return;
}
template<class Num>void write(Num x)
{
    if(x < 0) putchar('-'), x = -x;
    static char s[20];int sl = 0;
    while(x) s[sl++] = x%10 + '0',x /= 10;
    if(!sl) {putchar('0');return;}
    while(sl) putchar(s[--sl]);
}

#define REP(__i,__st,__ed) for(int __i = (__st); __i <= (__ed); __i++)
#define _REP(__i,__st,__ed) for(int __i = (__st); __i >= (__ed); __i--)
const int maxn = 1e5 + 50, maxk = 105;
const long long LINF = 0x3f3f3f3f3f3f3f3fLL;

struct type_worker 
{
    int L, P, S;

    void scan()
    {
        read(L), read(P), read(S);
    }

}wk[maxk];

bool cmp(const type_worker &a, const type_worker &b)
{
    return a.S < b.S;
}

int N, K;
long long dp[maxk][maxn];

#define calc(x, y) (dp[x - 1][y] - (y)*wk[x].P)

long long solve()
{
//  f[i][j] = f[i-1][k] + (j - k)*P[i] = (f[i-1][k] - k*P[i]) + j*P[i]
// 0 <= j - k < Li     j - Li <= k < Si <= j 

    for(int i = 1; i <= K; i++)
    {
        long long maxv = -LINF;

        for(int p = std::max(std::min(wk[i].S + wk[i].L - 1, N) - wk[i].L, 0); p < wk[i].S; p++) maxv = std::max(maxv, calc(i, p));

        for(int j = std::min(wk[i].S + wk[i].L - 1, N); j >= wk[i].S ; j--)
        {
            if(j - wk[i].L >= 0) maxv = std::max(maxv, calc(i, j - wk[i].L));

            dp[i][j] = std::max(0LL, maxv + j*wk[i].P);
        }

        for(int j = 1; j <= N; j++)
            dp[i][j] = std::max(dp[i][j], std::max(dp[i - 1][j], dp[i][j - 1]));
    }

    return dp[K][N];
}
void init()
{
    read(N), read(K);

    REP(i, 1, K) wk[i].scan();

    std::sort(wk + 1, wk + K + 1, cmp);
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("1821.in","r",stdin);
    freopen("1821.out","w",stdout);
#endif

    init(), write(solve());

#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;           
}

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

转载于:https://www.cnblogs.com/dashgua/p/4722946.html

源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 在应对Windows 10与Ubuntu双系统无法正常启动的情况时,我们首先需要明确双系统启动的机制以及可能引发启动障碍的因素。在双系统环境下,计算机的启动过程由引导管理器(例如GRUB)负责操作系统选择。若启动流程中出现故障,可能源于引导管理器的设置被篡改,或因系统升级造成的不兼容性。 一、UEFI与Legacy BIOS的差异 在探究解决方案之前,我们必须辨识UEFI和Legacy BIOS这两种不同的启动模式。Legacy BIOS代表传统的BIOS设置,其运作依赖于MBR(主引导记录)分区表。相对地,UEFI代表一种更先进的启动技术,能够支持更大容量的硬盘以及更高级的功能,并且采用GPT(全局唯一标识分区表)。 对于Windows 10与Ubuntu的双系统配置,如果在Windows 10更新后遭遇无法进入Ubuntu的状况,极有可能是因为计算机的启动模式已从Legacy BIOS转变为UEFI,而Ubuntu的安装媒介或启动配置未相应地更新以适应这一转变。 二、处理流程 以下是处理Windows 10升级后无法启动Ubuntu双系统启动项的详细步骤: 1. 准备Ubuntu启动介质:你可以借助Ubuntu官方提供的资源制作启动介质,或者在Windows操作环境下利用工具来烧录启动U盘。 2. 通过U盘启动设备:将计算机的启动优先级设置为从U盘启动,并选择“试用Ubuntu”这一选项。 3. 更新系统及安装应用:一旦联网,打开终端,添加boot-repair软件源并更新系统软件包的索引,随后安装boot-repair这一工具。 4. 运行boot-repair进行修正...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 罗技G502被众多专业游戏玩家视为一款高级游戏鼠标,特别是在《绝地求生》(PUBG)这类射击游戏中,其卓越的性能和高度可定制性为玩家带来了明显的竞争优势。"宏"作为游戏鼠标的一项核心功能,它允许用户预先设定一系列按键操作,通过单次点击即可完成,这对于执行复杂动作或提升反应速度具有显著作用。本指南将系统阐述如何在罗技G502鼠标上配置PUBG中的吃鸡宏,以及如何进行精准的压枪宏设定。对"宏"的基础原理进行深入理解是至关重要的。宏本质上是通过特定编程语言构建的一系列指令链,这些指令可以涵盖键盘按键、鼠标操作或预设的时间间隔。在罗技G502鼠标中,用户可借助罗技的G HUB软件来完成宏的构建与修改。 1. **安装G HUB软件**:从罗技官方网站获取并安装最新版的G HUB。该软件为用户提供了对G502鼠标的全方位调控能力,涵盖了宏设置等各项功能。 2. **构建宏**:启动G HUB,定位到"鼠标"标签页,随后点击"按钮"。选择需要绑定宏的鼠标按键,点击"绑定",再选择"录制宏"。 3. **录制宏**:按下"开始录制"后,执行意图记录的动作,例如连续射击、迅速切换武器等。在PUBG内,压枪宏通常涉及持续按住鼠标左键并辅以细微的鼠标向下移动,以此模拟高级玩家手动压枪的技巧。 4. **调整宏**:完成录制后,用户可利用编辑器对宏的细节进行优化,比如增加延迟时间以实现更精细的压枪效果,或更改按键的排列顺序以适应不同的游戏情境。 5. **存储并应用宏**:为宏命名并保存,随后将其分配到G502鼠标的任一按键上。务必确保在游戏过程中禁用可能引发冲突的第三方宏软件。 6. **压枪宏...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值