北大OJ1458 Common Subsequence C语言AC

自己尝试了几次,需要注意几点:
  1.数组不能太小:

  2.需要注意DP所用二维数组和输入一维数组对应关系。
下面是AC的代码,仅供参考

#include <stdio.h>   
#include <string.h> 
#define MAX 500   
void LCSLength(int m, int n, char x[], char y[],int c[][MAX])   
{   
    int i, j;
    c[0][0]=0;
    for(i = 1; i <= m; i++) c[i][0] = 0;   //第一列置0
    for(i = 0; i <= n; i++) c[0][i] = 0;   //第一行置0
    for(i = 1; i <= m; i++)   
        for(j = 1; j<=n; j++)   
        {   
            if(x[i-1]==y[j-1])    
            {   
                c[i][j] = c[i-1][j-1] + 1;     //所比较字符相等就取二维数组的左上角元素+1
            }else if(c[i-1][j]>=c[i][j-1]){   
                c[i][j] = c[i-1][j]> c[i][j-1]?c[i-1][j]: c[i][j-1];    //否则取左边和上面较大的数
        }
        printf("%d\n", c[m-1][n-1]);     
}   
   
int main()   
{   
    char s1[MAX];   
    char s2[MAX];     
    int c[MAX][MAX];   
    int len1, len2 ;  
    while(scanf("%s %s", s1, s2) !=EOF) 
    {  
        len1= strlen(s1);   
        len2= strlen(s2);   
        LCSLength(len1+1,len2+1, s1, s2, c);
         
    }    
    return 0;   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在计算机科学中,尤其是在线竞赛(OJ,Online Judge)中,处理高精度加法是一个常见的任务,因为通常涉及的大整数超出了标准数据类型(如int或long long)的范围。在C语言中,要实现高精度加法,一种常用的方法是使用数组或者动态内存分配来存储大整数,并逐位进行加法运算。 以下是一个简单的高精度加法算法的步骤: 1. 定义两个大整数数组,每个元素存储一位数字。 2. 初始化两个指针,分别指向这两个数组的末尾。 3. 当两个指针所指向的位数不相同时,将较小数组的剩余位补零。 4. 对应位置的数字进行加法(0-9,10可能需要进位),并更新结果数组。 5. 如果在某个步骤发生了进位,需要在前一个位置增加1。 6. 指针向前移动一位,直到其中一个指针达到数组末尾。 7. 如果还有剩余的进位,将它加到结果数组的最前面。 这是一个简化版的描述,实际的代码实现会涉及到更多的边界检查和错误处理。下面是一个简化的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DIGITS 10000 // 可以根据需要调整 char* addStrings(char* str1, char* str2) { int len1 = strlen(str1); int len2 = strlen(str2); int max_len = len1 > len2 ? len1 : len2; int carry = 0; char* result = (char*)malloc((max_len + 1) * sizeof(char)); result[max_len] = '\0'; for (int i = max_len - 1; i >= 0; --i) { int sum = carry + (str1[i] - '0') + (str2[i] - '0'); result[i] = sum % 10 + '0'; carry = sum / 10; } if (carry) { result = carry + '0'; } return result; } int main() { char* str1 = "123456789"; char* str2 = "987654321"; char* result = addStrings(str1, str2); printf("Result: %s\n", result); free(result); // 一定要记得释放动态内存 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值