动态规划问题

动态规划问题

最长回文子串

题目:给你一个字符串s,找到s中最长的回文子串,并输出.(leetcode 5)

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

代码实现:

char *longestPalindrome(char *s)
{
    int n=strlen(s);
    if(n<2) return s;
    int maxlen=1;
    int begin=0;
    int **dp=(int **)malloc(sizeof(int *)*n);
    for(int i=0;i<n;i++){
        dp[i]=(int *)malloc(sizeof(int)*n);
    }
    for(int i=0;i<n;i++){
        dp[i][i]=1;
    }
    for(int L=2;L<=n;L++){
        for(int i=0;i<n;i++){//i是回文序列的区间左端点
        int j=i+L-1;//j是回文序列的区间右端点
        if(j>=n)  break;
        if(s[i]!=s[j]){
            dp[i][j]=0;
        }else{
            if(j-i<3){
                dp[i][j]=1;
            }else{
                dp[i][j]=dp[i+1][j-1];//每一次的回文序列判断依赖于上一次,而上一次再次之前就已经判断过
            }
        }
         if(dp[i][j]&&j-i+1>maxlen){
            maxlen=j-i+1;
            begin=i;
         }
        }
    }
    char *result=(char *)malloc(sizeof(char)*(maxlen+1));
    strncpy(result,s+begin,maxlen);
    result[maxlen]='\0';
    for(int i=0;i<n;i++){
        free(dp[i]);
    }
    free(dp);
    return result;
}

思维提升:一个二维数组(a[i] [j]),不仅可以看成是一个i*j的矩阵,同时也可以看成是是一个i到j的闭区间[i,j].


斐波那契问题(高精度模拟)

题目:楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。1<=N<=5000;(洛谷 p1225)

编一个程序,计算共有多少种不同的走法。

输入:一个数字,楼梯数。

输出:走的方式总数。

代码实现:

#include 
#include 
#include 
// 定义一个较大的数组长度,用于存储高精度数
#define MAX_LEN 5003
// f[k][i]--第 k 阶台阶所对应的走法数
int f[MAX_LEN][MAX_LEN];
int len = 1;
// 高精度加法,k 来存阶数
void hp(int k)
{
    int i;
    for (i = 1; i <= len; i++)
    {
        f[k][i] = f[k - 1][i] + f[k - 2][i]; // 套用公式
    }
    for (i = 1; i <= len; i++)
    { // 进位
        if (f[k][i] >= 10)
        {
            f[k][i + 1] += f[k][i] / 10;
            f[k][i] = f[k][i] % 10;
            if (f[k][len + 1])
            {
                len++;
            }
        }
    }
}
int main()
{
    int n, i;
    // 输入 n
    scanf("%d", &n);
    // 初始化
    f[1][1] = 1;
    f[2][1] = 2;
    // 从 3 开始避免越界
    for (i = 3; i <= n; i++)
    {
        hp(i);
    }
    // 逆序输出
    for (i = len; i >= 1; i--)
    {
        printf("%d", f[n][i]);
    }
    return 0;
}

图片解释高精度模拟:

动态规划问题_第1张图片

你可能感兴趣的:(动态规划,算法,数据结构)