code[vs]3301 Square words

本文介绍了一个结合暴力枚举与最长公共子序列(LCS)算法的问题解决方法。该方法通过动态规划求解两个字符串的最长公共子序列长度,并利用此长度计算特定条件下所需的最小操作数。代码实现清晰地展示了如何初始化DP状态矩阵,更新状态值以找到最优解。

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

暴力枚举+最长公共子序列

#include <iostream>
#include <cstring>

using namespace std;

int dp[510][510];
int n;

int lcs(char * a, char * b, int lena, int lenb)
{
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= lena; i++)
    {
        for (int j = 1; j <= lenb; j++)
        {
            //递推公式
            if (a[i - 1] == b[j - 1])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
        }
    }
    //cout << "dp[" << lena << "][" << lenb << "]=" << dp[lena][lenb] << endl;
    return (n - 2 * dp[lena][lenb]);
}

int main()
{
    char str[510];

    cin >> n;
    int ans = n;
    cin >> str;
    for (int i = 1; i < n; i++)
    {
        ans = min(ans, lcs(str, str + i, i, n - i));
        //cout << "ans = " << ans << endl;
    }
    cout << ans;
    return 0;
}
%% OFDM系统参数设置 clear all; close all; clc; % 基本参数 N = 64; % 子载波数量 cp_len = 16; % 循环前缀长度 num_symbols = 100; % OFDM符号数量 mod_order = 4; % 调制阶数 (4=QPSK) snr = 5:2:15; % 信噪比范围(dB) num_snr_points = length(snr); %% LDPC编码设置 % 检查并加载DVB-S2 LDPC矩阵 if ~exist('dvbs2ldpc.mat', 'file') fprintf('正在下载DVB-S2 LDPC矩阵...\n'); try websave('dvbs2ldpc.mat', 'https://www.mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/46480/versions/1/dvbs2ldpc.mat'); fprintf('下载成功!\n'); catch error('无法下载dvbs2ldpc.mat文件,请检查网络连接'); end end load('dvbs2ldpc.mat'); % 选择码率 code_rate = 1/2; H = dvbs2ldpc(code_rate); ldpcEncoder = comm.LDPCEncoder(H); ldpcDecoder = comm.LDPCDecoder(H); % 获取LDPC编码参数 info_bits_per_block = ldpcEncoder.NumInformationBits; codeword_bits_per_block = ldpcEncoder.BlockLength; %% 数据长度计算与对齐 % 计算每个OFDM符号能承载的比特数 bits_per_symbol = N * log2(mod_order); % 计算总需要的编码比特数 required_encoded_bits = bits_per_symbol * num_symbols; % 计算需要的LDPC块数 num_ldpc_blocks = ceil(required_encoded_bits / codeword_bits_per_block); total_info_bits = num_ldpc_blocks * info_bits_per_block; % 接收端实际能解码的LDPC块数 num_ldpc_codewords = floor(required_encoded_bits / codeword_bits_per_block); info_bits_actual = num_ldpc_codewords * info_bits_per_block; fprintf('系统参数:\n'); fprintf(' OFDM符号数: %d, 每符号子载波: %d, 总传输比特: %d\n', ... num_symbols, N, required_encoded_bits); fprintf(' LDPC码率: %.2f, 每块信息比特: %d, 码字长度: %d\n', ... code_rate, info_bits_per_block, codeword_bits_per_block); fprintf(' 发送端LDPC块数: %d, 接收端可解码块数: %d\n', ... num_ldpc_blocks, num_ldpc_codewords); fprintf(' 总信息比特: %d, 实际解码比特: %d\n\n', ... total_info_bits, info_bits_actual); %% BER存储 ber_results = zeros(num_snr_points, 1); last_constellation = []; % 存储最后一个SNR点的星座图 %% 主循环 - 不同SNR下的仿真 for snr_idx = 1:num_snr_points current_snr = snr(snr_idx); fprintf('\n正在仿真 SNR = %d dB...\n', current_snr); % 错误统计初始化 total_errors = 0; total_bits = 0; % 多次迭代以获得更准确的BER估计 num_iterations = 10; for iter = 1:num_iterations %% 发射端处理 % 生成随机二进制数据 (额外生成8%的冗余数据) data = randi([0 1], total_info_bits, 1); % LDPC编码 encoded_data = zeros(codeword_bits_per_block * num_ldpc_blocks, 1); for blk = 1:num_ldpc_blocks start_idx = (blk-1)*info_bits_per_block + 1; end_idx = blk*info_bits_per_block; encoded_block = ldpcEncoder(data(start_idx:end_idx)); encoded_data((blk-1)*codeword_bits_per_block+1 : blk*codeword_bits_per_block) = ... encoded_block; end % 截取刚好够用的编码后数据 tx_encoded = encoded_data(1:required_encoded_bits); % 数字调制 (QPSK) mod_data = qammod(tx_encoded, mod_order, 'InputType', 'bit', 'UnitAveragePower', true); % 串并转换 mod_data = reshape(mod_data, N, num_symbols); % IFFT变换 ofdm_symbols = ifft(mod_data, N); % 添加循环前缀 ofdm_symbols_cp = [ofdm_symbols(end-cp_len+1:end, :); ofdm_symbols]; % 并串转换 tx_signal = ofdm_symbols_cp(:); %% 信道传输 rx_signal = awgn(tx_signal, current_snr, 'measured'); %% 接收端处理 % 串并转换 rx_signal_parallel = reshape(rx_signal, N+cp_len, num_symbols); % 去除循环前缀 rx_symbols_no_cp = rx_signal_parallel(cp_len+1:end, :); % FFT变换 rx_data_freq = fft(rx_symbols_no_cp, N); % 信道均衡 (简单零 forcing均衡) H_est = ones(N, 1); % 假设理想信道估计 rx_data_eq = rx_data_freq ./ H_est; % 解调 - 输出LLR用于LDPC解码 rx_llr = qamdemod(rx_data_eq(:), mod_order, 'OutputType', 'approxllr', 'UnitAveragePower', true); %% LDPC解码 % 将接收数据分割为LDPC码字 rx_data_decoded = zeros(info_bits_actual, 1); for blk = 1:num_ldpc_codewords start_idx = (blk-1)*codeword_bits_per_block + 1; end_idx = min(blk*codeword_bits_per_block, length(rx_llr)); codeword_llr = rx_llr(start_idx:end_idx); % 解码时处理可能的LLR长度不足 if length(codeword_llr) < codeword_bits_per_block codeword_llr = [codeword_llr; zeros(codeword_bits_per_block-length(codeword_llr), 1)]; end decoded_bits = ldpcDecoder(codeword_llr); rx_data_decoded((blk-1)*info_bits_per_block+1 : blk*info_bits_per_block) = ... decoded_bits; end %% 性能评估 - 比较实际传输的信息比特 [errors, bits] = biterr(data(1:info_bits_actual), rx_data_decoded); total_errors = total_errors + errors; total_bits = total_bits + bits; % 保存最后一个SNR点的星座图 if snr_idx == num_snr_p修改为正确完整的代码
06-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值