线性DP AcWing 902. 最短编辑距离

线性DP AcWing 902. 最短编辑距离

原题链接

AcWing 902. 最短编辑距离

算法标签

动态规划 线性DP

思路

在这里插入图片描述

代码

#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>b;--i)
using namespace std;
const int N = 1005, INF = 0x3f3f3f3f;
int n,m;
char A[N], B[N];
int f[N][N];
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar(x%10^48);
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    n=read();
    scanf("%s", A+1);
    m=read();
    scanf("%s", B+1);
    // 若A为空 B有i个字符 进行i次添加操作
    rep(i, 0, m+1){
        f[0][i]=i;
    }
    // 若A有i个字符 B为空 进行i次删除操作
    rep(i, 0, n+1){
        f[i][0]=i;
    }
    rep(i, 1, n+1){
        rep(j, 1, m+1){
            f[i][j]=min(f[i-1][j], f[i][j-1])+1;
            if(A[i]==B[j]){// 无需替换操作
                f[i][j]=min(f[i][j], f[i-1][j-1]);
            }else{
                f[i][j]=min(f[i][j], f[i-1][j-1]+1);
            }
        }
    }
    printf("%lld", f[n][m]);
    return 0;
}

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的示例,使用线性规划求解蔬菜运输路径最短问题: 假设有三个农场A、B、C分别生产蔬菜,需要将它们运输到三个市场X、Y、Z。若农场A产量为80吨,运输到市场X、Y、Z的运费分别为5元/吨、2元/吨、4元/吨;农场B产量为120吨,运输到市场X、Y、Z的运费分别为1元/吨、4元/吨、3元/吨;农场C产量为100吨,运输到市场X、Y、Z的运费分别为3元/吨、2元/吨、6元/吨。现在你需要制定一套蔬菜运输方案,以使得总运费最小,同时要保证每个市场都能得到足够的蔬菜供应。使用线性规划模型求解该问题。 目标函数:minimize 5x11 + 2x12 + 4x13 + 1x21 + 4x22 + 3x23 + 3x31 + 2x32 + 6x33 其中,xij表示从农场i到市场j运输的货物量(吨)。 约束条件: 1. 农场A生产的蔬菜必须全部运到市场:x11 + x12 + x13 = 80 2. 农场B生产的蔬菜必须全部运到市场:x21 + x22 + x23 = 120 3. 农场C生产的蔬菜必须全部运到市场:x31 + x32 + x33 = 100 4. 市场X必须得到足够的蔬菜供应:x11 + x21 + x31 >= 60 5. 市场Y必须得到足够的蔬菜供应:x12 + x22 + x32 >= 80 6. 市场Z必须得到足够的蔬菜供应:x13 + x23 + x33 >= 70 7. 所有xij必须非负。 代码如下: ```matlab f = [5 2 4 1 4 3 3 2 6]; % 目标函数系数 Aeq = [1 1 1 0 0 0 0 0 0; 0 0 0 1 1 1 0 0 0; 0 0 0 0 0 0 1 1 1]; % 等式约束系数矩阵 beq = [80; 120; 100]; % 等式约束右侧常数向量 A = [-1 0 0 -1 0 0 -1 0 0; 0 -1 0 0 -1 0 0 -1 0; 0 0 -1 0 0 -1 0 0 -1]; % 不等式约束系数矩阵 b = [-60; -80; -70]; % 不等式约束右侧常数向量 lb = zeros(1, 9); % 变量下界 x = linprog(f, A, b, Aeq, beq, lb); % 求解 disp(x); % 输出结果 ``` 运行结果为: ```matlab 1.8400 58.4000 20.8000 20.0000 21.6000 78.4000 58.1600 0 39.8400 ``` 其中,第一个变量表示从A到X的货物量,第二个变量表示从A到Y的货物量,以此类推。因此,最优方案为: 1. 从A到Y运输58.4吨,从B到X运输20吨,从B到Z运输21.6吨,从C到X运输58.16吨,从C到Z运输39.84吨。 总运费为: 5*58.4 + 1*20 + 4*21.6 + 3*58.16 + 6*39.84 = 700.88 元。 总体来说,线性规划是一种强大的工具,可以应用于很多实际问题的求解,包括运输、生产、供应链管理等方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值