UVA - 709 Formatting Text

本文介绍了一种基于动态规划的文章排版优化算法,旨在减少文章的badness值,即通过调整单词间的空格数量使每行文字的美观度达到最优。文章首先定义了badness的计算方法,并详细阐述了动态规划求解过程。

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

题目大意:给n,然后在给出一篇文章,有若干个单词,以空行结束,现在要将文章排序使得文章的badness 越小。

badness 的计算方法,如果一行只有一个单词的话,若单词的长度小于n,则badness 增加500,否则为0。

若一行有多个单词,每两个单词之间的badness = (c - 1) ^ 2 (c为两个单词的空格数),要求,每行控制长度在n,并且头一个单词顶头,最后后一个单词顶尾,头疼的一题,又是一晚上,看了题解 ,,细节很重要,DP每一个单词最佳的放置位置,详细看题解,

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f;

char s[10005],words[10005][85];
int n,top,len[10005],dp[10005][85];

int DP(int i,int j)
{
    if(dp[i][j] != -1)
        return dp[i][j];
    dp[i][j] = INF;
    if(i == top){
        if(j == 0)
            return dp[i][j] = 0;
        else
            return dp[i][j];
    }
    //单独一行
    if(j == 0)
        dp[i][j] = min(dp[i][j],(len[i]<n?500:0)+DP(i+1,0));
    //行尾
    if(j+len[i] == n)
        return dp[i][j] = min(dp[i][j],DP(i+1,0));
    //行中
    else{
        //下一个单词可放位置
        int x=j+len[i]+1;

        for(int k = x; k < n; k++)
        {
            //此行k位置放不下下一个单词
            if(k + len[i+1] > n)
                break;
            int t = k - x;
            dp[i][j] = min(dp[i][j],t*t+DP(i+1,k));
        }
    }
    return dp[i][j];
}

void print(int i,int j)
{
    if(i == top)
    {
        puts("");
        return;
    }
    printf("%s",words[i]);
    if(j == 0 && dp[i][j] == dp[i+1][0]+(len[i]<n?500:0)){
        puts("");
        print(i+1,0);
    }
    else if(j+len[i] == n && dp[i][j] == dp[i+1][0]){
        puts("");
        print(i+1,0);
    }
    else{
        //下一个单词可放位置
        int x=j+len[i]+1;

        for(int k = x; k < n; k++)
        {
            //此行k位置放不下下一个单词
            if(k+len[i+1]>n)
                break;
            int t = k-x;
            if(dp[i][j] == t*t+dp[i+1][k])
            {
                for(int l = 0; l <= t; l++)
                    putchar(' ');
                print(i+1,k);
                break;
            }
        }
    }
}

int main(){
    while(scanf("%d",&n),n){
        getchar();
        top = 0;
        while(gets(s)){
            if(!s[0])
                break;
            int i = 0;
            for(;s[i]==' ';i++);
            for(;s[i];){
                sscanf(s+i,"%s",words[top]);
                for(; s[i]!=' '&&s[i]; i++);
                for(; s[i]==' '; i++);
                len[top] = strlen(words[top]);
                top++;
            }
        }
        len[top]=0;
        memset(dp,-1,sizeof(dp));
        DP(0,0);
        print(0,0);
    }
    return 0;
}


<think>嗯,用户需要解决Oracle11g环境中GoldenGate出现的OGG-02830错误。从提供的引用看,这个问题似乎与经典模式下的远程抽取方式不兼容有关。我需要根据用户给出的四个引用信息来梳理可能的解决方案。用户引用的内容中,[^3]明确指出经典模式下远程抽取方式已被弃用,而[^1][^2]提到的格式错误可能与数据类型转换或表结构有关,特别是LOB字段。但用户当前咨询的是OGG-02830错误,所以重点应放在引用[^3]的结论上。用户的环境是Oracle11g,这个版本兼容性需要特别注意。结合引用内容,解决方案应该集中在三个方向:首先验证配置模式是否正确(经典模式vs集成模式),其次检查OGG版本是否过高导致功能弃用问题,最后考虑表结构是否存在陷阱。在技术细节上,远程抽取时$TRANLOGOPTIONS$参数设置很关键。引用[^3]提到经典模式不再支持某些功能,可能需要切换为集成捕获模式(IntegratedCapture)。另外引用[^1]暗示LOB字段可能引发类似错误,虽然错误号不同但可以作为辅助参考。用户可能是DBA角色,从ta准确引用MOS文档编号的行为看,具备一定故障排查经验。但ta现在需要的是针对特定错误代码的实操方案,因此回复要聚焦在可执行的步骤上,比如具体的参数修改命令和版本降级路径。考虑到用户上次咨询过OGG错误,这次回复应该保持技术连贯性。方案中要强调版本检查(ggsci>version)、抽取模式切换(alterextractxxxintegratedcapture)等具体命令,这些都是直接解决问题的动作。</think> 以下是针对 Oracle 11g GoldenGate 中 **OGG-02830 Formatting Error** 的完整解决方案,综合引用信息和官方实践整理: --- ### **根本原因分析** 该错误通常由以下原因触发: 1. **不兼容的抽取模式** OGG 12c+ 在经典模式下弃用了远程抽取(即源端与目标端为同版本数据库时使用`TRANLOGOPTIONS REMOTEFETCH`)[^3]。 2. **表结构特殊性** 涉及 `LOB` 或特殊数据类型(如`RAW`)时旧版 OGG 存在转换缺陷(虽错误码不同,但需排查)[^1][^2]。 3. **SCN 同步问题** 数据库角色切换(如 Data Guard 主备切换)导致日志序列中断[^4]。 --- ### **解决方案步骤** #### **1. 检查并调整抽取模式** ```sql -- 查看当前抽取模式 GGSCI> VIEW PARAM <extract_name> ``` - **若存在 `TRANLOGOPTIONS REMOTEFETCH`** 立即删除此参数(11g 经典模式已不兼容远程抽取)[^3]。 - **切换为本地归档日志读取**: 确保源端归档日志可本地访问,并将参数修改为: ```bash TRANLOGOPTIONS ARCHIVELOGSOURCE /oracle/arch ``` #### **2. 验证 OGG 版本兼容性** ```bash ggsci> version ``` - **Oracle 11g 推荐版本**: OGG 11.2.1.x(最高至 11.2.1.7) - **若版本 ≥ 12c**: 降级至兼容版本或 **升级数据库**(11g 官方支持已于 2020 年终止)[^3][官方文档]。 #### **3. 处理特殊表结构** 对涉及报错表(如 `TBCONTRACTBALANCE`)执行: ```sql -- 检查 LOB/数据类型 SELECT column_name, data_type FROM all_tab_columns WHERE table_name='TBCONTRACTBALANCE'; ``` - **若存在 LOB 字段**: 在抽取参数中添加列映射规则: ```bash TABLE schemaname.TBCONTRACTBALANCE, COL.EXCEPT (LOB_COLUMN), COL.MAP (LOB_COLUMN = @BINARY); ``` #### **4. 修复 SCN 同步中断(若经历主备切换)** ```sql -- 重置抽取进程 SCN GGSCI> ALTER EXTRACT <extract_name>, SCN <target_scn>; GGSCI> START EXTRACT <extract_name> ``` - **删除过时参数**(防止日志重置冲突): ```bash # 移除参数文件中的配置 TRANLOGOPTIONS USEPREVRESETLOGSID # 删除此行! ```[^4] --- ### **预防措施** 1. **统一日志访问方式**: 避免混用`ASM`与文件系统日志,确保 OGG 直接读取归档日志。 2. **LOB 表特殊处理**: 对含 `LOB` 的表显式定义列转换规则[^1]。 3. **监控 Data Guard 切换事件**: 主备切换后立即暂停 OGG 并重置 SCN[^4]。 > **示例参数修正**(经典模式兼容方案): > ```bash > EXTRACT ext1 > USERID goldengate, PASSWORD xxx > EXTTRANFILE ./dirdat/et > TRANLOGOPTIONS ARCHIVELOGSOURCE /backup/archivelogs # 本地归档路径 > TABLE schema.*; > ``` --- ### **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值