2 条题解

  • 0
    @ 2025-10-8 16:48:42
    #include <bits/stdc++.h>
    using namespace std;
    char s1[2110], s2[2110];
    int f[2110][2110];
     
    int main()
    {
        int n1, n2, K;
        scanf("%s", s1 + 1); n1 = strlen(s1 + 1);
        scanf("%s", s2 + 1); n2 = strlen(s2 + 1);
        scanf("%d", &K);
        memset(f, 63, sizeof(f));
        for(int i = 1; i <= n1; i++) f[i][0] = i * K;
        for(int i = 1; i <= n2; i++) f[0][i] = i * K;
        f[0][0] = 0;
         
        for(int i = 1; i <= n1; i++)
            for(int j = 1; j <= n2; j++)
            {
                f[i][j] = min(f[i][j - 1] + K, f[i - 1][j] + K);
                f[i][j] = min(f[i][j], f[i - 1][j - 1] + abs(s1[i] - s2[j]));
            }
         
        printf("%d\n", f[n1][n2]); 
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:48:34
      #include<bits/stdc++.h>
      using namespace std;
      char s1[2110],s2[2110];
      int f[2110][2110];
       
      int main()
      {
          int n1,n2,K;
          scanf("%s",s1+1);n1=strlen(s1+1);
          scanf("%s",s2+1);n2=strlen(s2+1);
          scanf("%d",&K);
          memset(f,63,sizeof(f));
          for(int i=1;i<=n1;i++)f[i][0]=i*K;
          for(int i=1;i<=n2;i++)f[0][i]=i*K;
          f[0][0]=0;
           
          for(int i=1; i<=n1;i++)
              for(int j=1;j<=n2;j++)
              {
                  f[i][j]=min(f[i][j-1]+K,f[i-1][j]+K);
                  f[i][j]=min(f[i][j],f[i-1][j-1]+abs(s1[i]-s2[j]));
              }
           
          printf("%d\n",f[n1][n2]); 
          return 0;
      }
      • 1

      *【动态规划:区间二维一边推】字符距离

      信息

      ID
      152
      时间
      1000ms
      内存
      128MiB
      难度
      3
      标签
      递交数
      84
      已通过
      48
      上传者