【洛谷 SP283】NAPTIME - Naptime(DP)

博客主要探讨睡眠体力问题的解法。先给出一天情况下,用动态规划求解前i个小时睡j个小时的最大体力的状态转移方程及边界条件。接着考虑两天连着的情况,改变第一个小时的状态,再跑一遍DP,将结果与特定值取最大值得到最终答案,还提及因空间限制未用滚动数组。

题目链接

先考虑如果只有一天,那么该怎么做。
\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时正在睡觉时的最大体力,\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时没在睡觉时的最大体力。
则有
\[f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])\]
\[f[i][j][1]=max(f[[i-1][j-1][0],f[i-1][j-1][1])\]
边界条件:\(f[1][0][0]=f[1][1][1]=0\)
答案:\(max(f[n][b][0],f[n][b][1])\)
然后,现在两天是连着的,唯一的区别就是第一个小时可以睡着。
于是,令\(f[1][1][1]=U_1\),然后再跑一遍DP,把\(ans\)\(f[n][b][1]\)取最大值就行了。
为什么只与\(f[n][b][1]\)取最大值呢?
因为这里把\(f[1][1][1]\)赋值为了\(U_1\),那么我们默认就是第一个小时进入了熟睡状态,所以上一天最后一个小时必须开始睡觉才行。
因为SPOJ的空间限制比较大,我就没用滚动数组了。

#include <cstdio>
inline int max(int a, int b){
    return a > b ? a : b;
}
inline int min(int a, int b){
    return a < b ? a : b;
}
const int MAXN = 4000;
int f[MAXN][MAXN][3], w[MAXN];
int n, m, T;
int main(){
    scanf("%d", &T);
    while(T--){
      int ans = 0;
      scanf("%d%d", &n, &m);
      for(int i = 1; i <= n; ++i)
         scanf("%d", &w[i]);
      f[1][0][0] = f[1][1][1] = 0;
      for(int i = 2; i <= n; ++i){
         for(int j = 1; j <= min(i, m); ++j){
            f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1]);
            if(j != 1) f[i][j][1] = max(f[i - 1][j - 1][0], f[i - 1][j - 1][1] + w[i]);    //第一个小时不加体力
         }
      }
      f[1][1][1] = w[1]; f[1][0][0] = 0;   //边界
      ans = max(f[n][m][1], f[n][m][0]);
      for(int i = 2; i <= n; ++i)
         for(int j = 1; j <= min(i, m); ++j){
            f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1]);
            if(j != 1) f[i][j][1] = max(f[i - 1][j - 1][0], f[i - 1][j - 1][1] + w[i]);
         }
      ans = max(ans, f[n][m][1]);     
      printf("%d\n", ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/Qihoo360/p/9566842.html

<think>好的,我现在需要帮用户解决如何在PostgreSQL中配置或查看autovacuum参数的位置的问题。首先,用户之前已经询问过如何检查AutoVacuum是否开启,我的回答包括了三种方法和相关参数检查。现在用户进一步想知道如何配置或查看这些参数的位置,可能需要更具体的步骤。 用户提到了站内引用,但根据指示,我需要主要参考之前的对话和回答。之前的回答里提到了pg_settings表、进程状态、表级配置等。所以,查看参数应该涉及到系统表和配置文件,而配置的话可能涉及修改postgresql.conf或者ALTER SYSTEM命令。 首先,用户可能需要知道如何查看当前autovacuum的参数设置。在之前的回答里,我提到了使用SQL查询pg_settings表,所以这里可以详细说明如何通过pg_settings查看autovacuum相关的参数,比如autovacuum_vacuum_cost_limit等。另外,配置文件的位置通常是postgresql.conf,用户可能需要知道这个文件的位置以及如何修改。 然后,配置参数的方法可能有两种:直接编辑postgresql.conf或者使用ALTER SYSTEM命令。需要注意是否需要重启或者重载配置,这部分在之前的回答里提到过参数修改是否需要重启,所以这里也需要强调。 另外,用户可能还想了解表级参数的配置,这在之前的回答中也有涉及,比如通过ALTER TABLE来修改特定表的autovacuum设置。这时候需要举例说明如何操作。 可能还需要区分全局配置和表级配置的不同,以及它们的优先级,这在用户之前的问题中提到过,所以需要明确说明优先级关系。 此外,用户可能对参数的具体作用感兴趣,比如autovacuum_vacuum_scale_factor和autovacuum_vacuum_threshold,这些在触发条件中很重要,可以结合之前的引用内容来详细解释。 最后,要确保回答结构清晰,分步骤说明查看和配置的方法,包括位置和操作命令,同时提醒注意事项,比如重启服务或权限问题。可能还需要生成相关问题,比如如何优化参数,或者如何监控autovacuum的效果,这些在之前的回答中也有涉及,可以保持一致性。 总结下来,回答需要包括以下几个部分: 1. 查看全局参数的位置和方法(SQL查询和配置文件) 2. 配置全局参数的方法(编辑文件或ALTER SYSTEM) 3. 查看和配置表级参数的方法(ALTER TABLE) 4. 注意事项和常见问题(重启、优先级等) 5. 相关问题的生成 需要确保语言简洁,步骤明确,符合用户的实际操作需求,同时引用之前提到的参数和示例,保持连贯性。</think>以下是PostgreSQL中配置和查看AutoVacuum参数位置的完整指南,按操作优先级排序: ### 一、查看AutoVacuum参数位置 #### 1. 动态参数查看(实时生效) ```sql SELECT name, setting, sourcefile, source FROM pg_settings WHERE name LIKE 'autovacuum%' OR name IN ('track_counts', 'log_autovacuum_min_duration'); ``` - **关键字段说明**: - `sourcefile`:显示参数所在配置文件路径,如:`/var/lib/pgsql/12/data/postgresql.conf` - `source`:显示参数来源(配置文件/命令行/默认值)[^1] #### 2. 配置文件定位 默认路径(根据安装方式不同可能变化): ```bash # 通过运行命令查找 psql -U postgres -c "SHOW config_file" ``` - 典型路径:`/etc/postgresql/[版本]/main/postgresql.conf` - 包含所有AutoVacuum参数的配置段: ```ini # AUTOVACUUM PARAMETERS autovacuum = on autovacuum_max_workers = 3 autovacuum_vacuum_cost_limit = -1 ``` ### 二、配置AutoVacuum参数方法 #### 1. 全局配置(影响所有表) | 方法 | 操作步骤 | 生效方式 | |-----------------------|--------------------------------------------------------------------------|-----------------| | **直接编辑配置文件** | 修改`postgresql.conf`中参数值 | 需`pg_ctl reload`或重启 | | **ALTER SYSTEM命令** | ```sql ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.1; ``` | 立即写入`postgresql.auto.conf`,需重载配置 | #### 2. 表级配置(覆盖全局设置) ```sql ALTER TABLE your_table SET ( autovacuum_enabled = true, autovacuum_vacuum_threshold = 500, autovacuum_analyze_threshold = 250 ); ``` - **存储位置**:表参数存储在`pg_class.reloptions`系统字段中[^2] ### 三、核心参数对照表 | 参数名称 | 默认值 | 功能说明 | 修改建议 | |-----------------------------------|-----------|---------------------------------------|--------------------------| | `autovacuum` | on | 总开关 | 生产环境必须保持开启 | | `autovacuum_vacuum_threshold` | 50 | 触发清理的最小死元组数 | 大表建议调整为500-1000 | | `autovacuum_vacuum_scale_factor` | 0.2 | 触发清理的死元组占比阈值 | 大表建议设为0.05-0.1 | | `autovacuum_max_workers` | 3 | 最大并行清理进程数 | 根据CPU核心数调整 | | `autovacuum_naptime` | 1min | 检查周期 | 高负载库建议缩短至30s | ### 四、配置验证流程 1. **确认修改生效**: ```sql SELECT name, setting, source FROM pg_settings WHERE name = 'autovacuum_vacuum_cost_limit'; ``` 2. **观察参数优先级**: ```sql SELECT relname, reloptions FROM pg_class WHERE reloptions::text ~ 'autovacuum'; ``` 3. **监控生效情况**: ```sql SELECT schemaname, relname, last_autovacuum FROM pg_stat_user_tables WHERE n_dead_tup > 0; ``` ### 注意事项 1. 表级配置优先级高于全局配置[^3] 2. 修改`postgresql.conf`需要`pg_ctl reload`生效(部分参数需重启) 3. 生产环境建议先通过`ALTER SYSTEM`测试参数效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值