Rebuilding Roads(POJ1947)树状dp

本文介绍了如何通过学习水题RebuildingRoads来理解树状DP的概念,包括使用特殊的节点存储方式(父亲节点、最后一个儿子节点、相邻兄弟节点),以及实现状态转移方程来解决最小化边数的问题。代码示例展示了如何通过DFS遍历树结构,并计算构成特定子树所需的最少边数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到了写树状dp的题看着有点意思,就学习了一下,从0开始,从水题开始。首先做了一道POJ上的水题Rebuilding Roads(POJ1947)

    首先,这道题的输入储存是我以前没有用过的,用father[]储存父亲,而用son[]储存最后一个儿子,而brother[]则储存了相邻的兄弟节点,这样的方法是这次get的技能之一。
    其次这道题就是dp的转移dp[i][j]记录下第i个节点构成节点数为j的子树需要除去的最少的边数。但是不算去除自己父亲节点的边,状态转移方程在代码中。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <functional>
#include <cstdio>
#include <queue>
#include <map>
#include <algorithm>
#include <stack>
#include <utility>
typedef long long ll;
using namespace std;
const int mx = 155;
int father[mx],son[mx],brother[mx];
int mi[mx][mx],n,p;
int root;
void dfs(int point)
{
    int k;
    for(k = 0; k <= p; k++)
        mi[point][k] = 1000000000;
    mi[point][1] = 0;
    k = son[point];
    while(k)
    {
        dfs(k);
        for(int i = p; i >= 1; i--)
        {
            mi[point][i] = mi[point][i] + 1;
            for(int j = 1; j < i; j++)
                mi[point][i] = min(mi[point][i],mi[k][i - j] + mi[point][j]);
        }
        k = brother[k];
    }
}

int main ()
{
    int i,j,k,l,ans;
    while(~scanf("%d%d",&n,&p))
    {
        memset(father,0,sizeof(father));
        memset(son,0,sizeof(son));
        memset(brother,0,sizeof(brother));
        memset(mi,0,sizeof(mi));
        for(i = 1; i < n; i++)
        {
            scanf("%d%d",&l,&k);
            father[k] = l;
            brother[k] = son[l];
            son[l] = k;
        }
        for(i = 1; i <= n; i++)
            if(father[i] == 0)
                break;
        dfs(i);
         ans = mi[i][p];
        for(int i  = 1; i <= n; i++)
            ans = min (ans,mi[i][p] + 1);
        printf("%d\n",ans);
    }
    return 0;
}
代码中还是有不清楚的地方,就是在状态转移方程中有一段代码
      mi[point][i] = mi[point][i] + 1;
不清楚是做什么用的,但是去了之后却无法AC,以后再想想有待更新


<think>我们正在讨论硬盘在RAID阵列中的状态,特别是'unconfiguredbad'和'rebuilding'这两种告警状态。根据引用[1]的内容,我们可以知道:-'Unconfigured'有两种情况:一是硬盘未配置在RAID中,二是逻辑错误导致硬盘未被识别。-'Unconfiguredbad'可能是硬盘物理损坏或逻辑错误导致的未配置状态。-'Rebuilding'表示RAID阵列正在重建,通常是在更换故障硬盘后,新硬盘正在同步数据的过程。接下来,我们将详细解释这两种状态的含义、原因和解决方法。</think>### 硬盘告警状态 "Unconfigured Bad" 与 "Rebuilding" 详解 #### 一、**Unconfigured Bad 状态** **含义**: 硬盘处于 **未配置且损坏** 的状态,表示RAID控制器检测到硬盘存在物理故障或逻辑错误,无法加入RAID阵列[^1]。包含两种可能情况: 1. **物理损坏** - 硬盘磁头故障、坏道超过阈值 - 接口电路损坏或连接异常 - SMART检测到不可恢复错误 2. **逻辑错误** - RAID元数据损坏(如RAID卡逻辑丢失) - 硬盘分区表/文件系统损坏 - 意外断电导致配置信息丢失 **影响**: - 阵列降级运行(若为冗余阵列如RAID 5/6) - 数据完整性风险(需立即处理) **解决方法**: ```mermaid graph LR A[检测状态] --> B{故障类型} B -->|物理损坏| C[更换新硬盘] B -->|逻辑错误| D[尝试修复] D --> D1[导入RAID逻辑数据] D --> D2[重建元数据] D --> D3[低级格式化] C --> E[启动Rebuild] ``` 具体步骤: 1. **物理损坏处理** - 立即更换硬盘 - 执行阵列重建(见Rebuilding部分) 2. **逻辑错误修复** - 通过RAID管理工具 **重新导入逻辑配置**(如MegaCLI命令): ```bash MegaCli -CfgForeign -Import -aALL # 导入外部配置 ``` - 使用`fsck`或`chkdsk`修复文件系统 - 终极方案:备份数据后执行低级格式化 #### 二、**Rebuilding 状态** **含义**: RAID阵列正在 **自动重建数据** 到新硬盘,通常发生在: - 更换故障硬盘后 - 添加热备盘触发自动重建 - 手动启动重建任务 **核心过程**: $$ \text{重建速率} = \frac{\text{阵列容量}}{\text{重建时间}} \propto \frac{1}{\text{硬盘数量} \times \text{负载强度}} $$ 重建期间阵列处于脆弱状态(二次故障将导致数据丢失) **最佳实践**: 1. **环境准备** - 确保UPS供电稳定 - 关闭非必要服务降低负载 2. **监控参数** ```bash # MegaCLI监控示例 MegaCli -PDList -aAll | grep 'Rebuild Progress' # 输出:Rebuild Progress: 45% # 重建进度百分比 ``` 3. **加速技巧** - 调整重建优先级(如Dell PERC卡的`Background Initialization Rate`) - 启用高速缓存策略:`WriteBack` > `WriteThrough` #### 三、关键操作对比 | 状态 | 风险等级 | 处理窗口 | 数据影响 | |---------------|----------|----------|-------------------| | Unconfigured Bad | ★★★★ | 紧急 | 立即丢失冗余保护 | | Rebuilding | ★★☆ | 持续监控 | 重建失败导致崩溃 | #### 四、高级故障处理 当出现 **"Unconfigured Bad" 且无法重建** 时: 1. 使用`ddrescue`尝试镜像损坏盘数据: ```bash ddrescue /dev/sdb /mnt/backup/sdb.img rescue.log ``` 2. 通过RAID重组工具重构阵列(如`R-Studio`、`UFS Explorer`) 3. 专业数据恢复服务(开盘处理) > **重要原则**: > - 重建过程中禁止强制重启 > - 物理损坏硬盘需专业检测后再弃用 > - 定期验证备份完整性(推荐3-2-1备份策略) --- ### 相关问 1. **如何判断"Unconfigured Bad"是物理损坏还是逻辑错误?** 2. **RAID 5阵列在Rebuilding时发生第二块硬盘故障该如何挽救数据?** 3. **哪些因素会影响RAID重建速度?如何优化重建时间?** 4. **企业级存储中"Global Hot Spare"和"Dedicated Hot Spare"有何区别?** 5. **如何预防由Unconfigured Bad状态引发的数据灾难?** [^1]: 引用自RAID技术文档:物理损坏需更换硬盘,逻辑错误可通过导入配置修复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值