基础动态规划题目基础动态规划题目

目录

题目1: P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles

 代码示例:

题目2: Common Subsequence

代码示例

题目3 :最长上升子序列

最长不下降子序列

最长上升子序列oj答案

题目1: P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles

P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1216

 代码示例:

// c++ 代码示例
#include <algorithm>
#include <iostream>

using namespace std ;

int n,a[1005][1005],f[1005][1005] ;

int dfs(int x, int y)
{
    if (x == n) return a[x][y] ;
    if (f[x][y] != -1) return f[x][y] ;
    return f[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + a[x][y] ;
}

int main()
{
    int n ;
    cin >> n ;
    for (int i = 1 ; i <= n ; i++)
    {
        for (int j = 1 ; j <= i ; j++)
        {
            cin >> a[i][j] ;
        }
    }
    for (int i = 1 ; i <= n ; i++)
    {
        for (int j = 1 ; j <= i ; j++)
        {
            f[i][j] = -1 ;
        }
    }
    cout << dfs(1, 1) ;
    return 0 ;
}
// c++ 代码示例

#include <algorithm>
#include <iostream>
using namespace std ;

long long n, a[1005][1005] ;
int main()
{
    cin >> n ;
    for (int i = 1 ; i <= n ; i++)
    {
        for (int j = 1 ; j <= i ; j++)
        {
            cin >> a[i][j] ;
        }
    }
    for (int i = n ; i >= 1 ; i--)
    {
        for (int j = 1 ; j <= i ; j++)
        {
            a[i][j] = a[i][j] + max(a[i + 1][j], a[i + 1][j + 1]);        
            
        }
    }
    cout << a[1][1] ;
    return 0 ;
    
}

 

// c++ 代码示例

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;

#define rint register int
inline void read(int &x)
{
    x = 0;
    int w = 1;
    char ch = getchar();
    while (!isdigit(ch) && ch != '-')
    {
        ch = getchar();
    }
    if (ch == '-')
    {
        w = -1;
        ch = getchar();
    }
    while (isdigit(ch))
    {
        x = (x << 3) + (x << 1) + (ch ^ '0');
        ch = getchar();
    }
    x = x * w;
}

const int maxn = 1000 + 10;

int n, a[maxn][maxn], ans;

int main()
{
    read(n);
    for (rint i = 1; i <= n; i++)
    {
        for (rint j = 1; j <= i; j++)
        {
            read(a[i][j]);
            if (i == 1 && j == 1)
            {
                // The top of the triangle
                continue;
            }
            if (j == 1)
            {
                // Left boundary
                a[i][j] += a[i - 1][j];
            }
            else if (j == i)
            {
                // Right boundary
                a[i][j] += a[i - 1][j - 1];
            }
            else
            {
                // Middle elements
                a[i][j] += max(a[i - 1][j - 1], a[i - 1][j]);
            }
            ans = max(ans, a[i][j]);
        }
    }
    cout << ans << endl;
    return 0;
}

题目2: Common Subsequence

Common Subsequence - HDU 1159 - Virtual Judge (vjudge.net)icon-default.png?t=N7T8https://vjudge.net/problem/HDU-1159

代码示例

// c++ 代码示例
int a[MAXN], b[MAXN], f[MAXN][MAXN] ;

int dp()
{
    for (int i = 1 ; i <= n ; i++)
    {
        for (int j = 1 ; j <= m ; j++)
        {
            if (a[i - 1] == b[j - 1])
            {
                f[i][j] = f[i - 1][j - 1] + 1 ;
            }
            else
            {
                f[i][j] = std::max(f[i - 1][j], f[i][j - 1]) ;
            }
        }
    }
    return f[n][m] ;
}
// c++ 代码示例

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
 
using namespace std;
 
char a[1001], b[1001];
int dp[1001][1001], len1, len2;
 
void lcs(int i,int j)
{
    for(i=1; i<=len1; i++)
    {
        for(j=1; j<=len2; j++)
        {
            if(a[i-1] == b[j-1])
                dp[i][j] = dp[i-1][j-1] + 1;
            else if(dp[i-1][j] > dp[i][j-1])
                dp[i][j] = dp[i-1][j];
            else
                dp[i][j] = dp[i][j-1];
        }
    }
}
 
int main()
{
    while(~scanf(" %s",a))
    {
        scanf(" %s", b);
        memset(dp, 0, sizeof(dp));
        len1 = strlen(a);
        len2 = strlen(b);
        lcs(len1, len2);
        printf("%d\n", dp[len1][len2]);
    }
    return 0;
}

题目3 :最长上升子序列

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)icon-default.png?t=N7T8http://ybt.ssoier.cn:8088/problem_show.php?pid=1281

最长不下降子序列

//c++代码示例
# include <iostream>
# include <cstdio>
using namespace std ;
int n ;
int a[1001] ;
int f[1001] ;
int mx = -1 ;
int main()
{
    scanf("%d", &n) ;
    for (int i = 1 ; i <= n ; i++)
    {
        scanf("%d", &a[i]) ;
        f[i] = 1 ;
    }
    for (int i = 2 ; i <= n ; i++)
    {
        for (int j = i - 1 ; j >= 1 ; j--)
        {
            if (a[i] >= a[j])
            {
                f[i] = max(f[i], f[j] + 1) ;
            }
        }
    }
    for (int i = 1 ; i <= n ; i++)
    {
        mx = max(mx, f[i]) ;
    }
    printf("%d", mx) ;
    return 0 ;
    
}
//c++代码示例
# include <iostream>
# include <cstdio>
using namespace std ;
int n ;
int a[1001] ;
int f[1001] ;
int mx = -1 ;
int main()
{
    scanf("%d", &n) ;
    for (int i = 1 ; i <= n ; i++)
    {
        scanf("%d", &a[i]) ;
        f[i] = 1 ;
    }
    for (int i = n - 1 ; i >= 1 ; i--)
    {
        for (int j = i + 1 ; j <= n ; j++)
        {
            if (a[i] <= a[j])
            {
                f[i] = max(f[i], f[j] + 1) ;
            }
        }
    }
    for (int i = 1 ; i <= n ; i++)
    {
        mx = max(mx, f[i]) ;
    }
    printf("%d", mx) ;
    return 0 ;
    
}

最长上升子序列oj答案

//c++代码示例
# include <iostream>
# include <cstdio>
using namespace std ;
int n ;
int a[1001] ;
int f[1001] ;
int mx = -1 ;
int main()
{
    scanf("%d", &n) ;
    for (int i = 1 ; i <= n ; i++)
    {
        scanf("%d", &a[i]) ;
        f[i] = 1 ;
    }
    for (int i = n - 1 ; i >= 1 ; i--)
    {
        for (int j = i + 1 ; j <= n ; j++)
        {
            if (a[i] < a[j])
            {
                f[i] = max(f[i], f[j] + 1) ;
            }
        }
    }
    for (int i = 1 ; i <= n ; i++)
    {
        mx = max(mx, f[i]) ;
    }
    printf("%d", mx) ;
    return 0 ;
    
}

相关推荐

  1. 动态规划入门题目

    2024-07-16 22:08:02       59 阅读
  2. 【LeetCode】动态规划--题目练习

    2024-07-16 22:08:02       38 阅读
  3. 动态规划基础

    2024-07-16 22:08:02       56 阅读
  4. 动态规划基础

    2024-07-16 22:08:02       41 阅读
  5. 动态规划基础

    2024-07-16 22:08:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 22:08:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 22:08:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 22:08:02       58 阅读
  4. Python语言-面向对象

    2024-07-16 22:08:02       69 阅读

热门阅读

  1. git开发流程

    2024-07-16 22:08:02       18 阅读
  2. 5. 基于Embedding实现超越elasticsearch高级搜索

    2024-07-16 22:08:02       23 阅读
  3. 业务需求方面

    2024-07-16 22:08:02       17 阅读
  4. ABC分析模型详解

    2024-07-16 22:08:02       17 阅读
  5. Ceph资源池pool管理

    2024-07-16 22:08:02       18 阅读
  6. 常用知识点问答

    2024-07-16 22:08:02       21 阅读
  7. MongoDB 面试题及答案整理,最新面试题

    2024-07-16 22:08:02       19 阅读
  8. 记录一次Android推流、录像踩坑过程

    2024-07-16 22:08:02       20 阅读
  9. LINUX:懒汉单例模式线程池

    2024-07-16 22:08:02       20 阅读
  10. flask-login会话保持实现

    2024-07-16 22:08:02       23 阅读
  11. C调用C++接口

    2024-07-16 22:08:02       22 阅读
  12. 年轻人如何克服焦虑

    2024-07-16 22:08:02       19 阅读