zoukankan      html  css  js  c++  java
  • dp[2019.5.25]_2

      1、对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0,空格与其他字符的距离为一定值k。

      在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串A和B的扩展距离。

    算法要求如下:

    1、 数据输入:第1行是字符串A,第2行是字符串B,第3行是空格与其他字符的距离定值k。

    2、 输出:字符串A和B的扩展距离。

    Input:

          cmc

          snmn

          2

    Output:

      10

    注:设字符串A和B的子串A[1..i]和B[1..j]的扩展距离为val(i,j),则val(i,j)具有最优子结构性质,递归定义为:val(i,j)=min{val(i-1,j)+k, val(i,j-1)+k, val(i-1,j-1)+dist(ai,bj)}

    dp思想:

      将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=5000;
    int dp[maxn][maxn];
    string s,k;
    int dist(int i,int j)
    {
        int p1=s[i-1]-'a';
        int p2=k[j-1]-'a';
        return abs(p1-p2);
    }
    int main()
    {
        memset(dp,0,sizeof(dp));
        cin>>s>>k;
        int t;
        cin>>t;
        int len = max(s.size(),k.size());
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=s.size();i++)
        {
            dp[i][0]=t*i;
        }
        for(int i=1;i<=k.size();i++)
        {
            dp[0][i]=t*i;
        }
        for(int i=1;i<=s.size();i++)
        {
            for(int j=1;j<=k.size();j++)
            {
                dp[i][j]=min(dp[i-1][j-1]+dist(i,j),min(dp[i-1][j]+t,dp[i][j-1]+t));
            }
        }
        int len1=s.size();
        int len2=k.size();
        cout<<dp[len1][len2]<<endl;
        return 0;
    
    }

     

     

    2、在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为0~99。

    Input:

    5 //表示三角形的行数 接下来输入三角形

    7

    3  8

    8  1  0

    2  7  4  4

    4  5  2  6  5

    Output:

      30

    dp基本思想:

      将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    #define Max 101
    int D[Max][Max];
    int n;
    int maxSum[Max][Max];
    int MaxSum(int i,int j)
    {
        if(maxSum[i][j]!=-1)
            return maxSum[i][j];
        if(i==n)
            maxSum[i][j]=D[i][j];
        else
        {
            int x=MaxSum(i+1,j);
            int y=MaxSum(i+1,j+1);
            maxSum[i][j]=max(x,y)+D[i][j];
        }
        return maxSum[i][j];
    }
    int main()
    {
        int i,j;
        cin>>n;
        for(i=1;i<=n;i++)
            for(j=1;j<=i;j++)
        {
            cin>>D[i][j];
            maxSum[i][j]=-1;
        }
        cout<<MaxSum(1,1)<<endl;
        return 0;
    }
  • 相关阅读:
    JS清除IE浏览器缓存的方法
    大数据基础2
    CI/CD
    手机连接fiddler
    npm run build 报错
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2
    读取ini文件的方法
    ES小知识
    svn连接pycharm
    创建python文件时添加相关信息
  • 原文地址:https://www.cnblogs.com/cruelty_angel/p/11021724.html
Copyright © 2011-2022 走看看