首页 > 编程语言 >C++U6-05 - 动态规划算法入门

C++U6-05 - 动态规划算法入门

时间:2024-02-25 20:11:47浏览次数:21  
标签:11 main 05 int U6 C++ long include dp

目标:动态规划

 

 

 

 

 

兔子数列的每一项都是前两项之和,公式为f[n]=f[n−1]+f[n−2] 。

#include<bits/stdc++.h>
using namespace std;

int main(){
    int f[105] , n;
    f[1] = 1;
    f[2] = 1;
    cin >> n;
    for(int i = 3 ; i <= n ; i++){
        f[i] = f[i-1] + f[i-2];    
    }
    cout << f[n];
    return 0;
} 
View Code

 

[钞票问题]

 

 

 

dp[i-1] 再拿 1 张 1 元钞票,则是 i 元,因此:dp[i] = dp[i-1] + 1;
dp[i-5] 再拿 1 张 5 元钞票,则是 i 元,因此:dp[i] = dp[i-5] + 1;
dp[i-11] 再拿 1 张 11 元钞票,则是 i 元,因此:dp[i] = dp[i-11] + 1;
题目要求最少的组合张数,所以只需要对 dp[i-1]+1, dp[i-5]+1, dp[i-11]+1 取最小即可。
状态转移方程:dp[i] = min{ dp[i-1]+1, dp[i-2]+1, dp[i-11]+1 };

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
int dp[N];
int main() {
    int c[5] = {1, 5, 11} , m;
    cin >> m ;
    memset(dp, 0x3f, sizeof(dp));
    dp[0] = 0;
    for (int i = 1; i <= m; i++) {
        for (int j = 0; j < 3 ; j++){
            if (i >= c[j]) {
                dp[i] = min((dp[i - c[j]] + 1) , dp[i]);
            }
        }
    }
    cout << dp[m] << endl;
    return 0;
}
View Code

 

[数字金字塔]

 

 

 

根据动态规划思想,从小的问题开始解决,我们从下往上开始计算。当前位置能获得的最大值为,当前值加上下面两数较大的值,可得动态转移方程式:dp[i][j]+=max(dp[i−1][j],dp[i−1][j+1]);

#include<bits/stdc++.h>
using namespace std;int dp[1005][1005];
int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++){
            cin >> dp[i][j];
        }
    }
    for(int i = n; i >= 1; i--){
        for(int j = 1; j <= i; j++){
            dp[i-1][j] += max(dp[i][j] , dp[i][j+1]);
        }
    }
    cout << dp[1][1] << endl;
    return 0;
}
View Code

 

[不同的路径]

 

 

假设能有一种状态 dp[i][j] 表示从 (1, 1) 到达 (i, j) 不同路径的总量。那么 m*n 的网格从 (1, 1) 到达 (m, n) 不同路径的总量,就是
dp[m][n]。根据题意 dp[i][j] 作为一次阶段性终点,它只能:
从上面来:dp[i-1][j] 向下走
从左边来:dp[i][j-1] 向右走
因此: dp[i][j] = dp[i-1][j] + dp[i][j-1];

#include<bits/stdc++.h>
using namespace std;
const int N = 101;
long long dp[N][N];
long long n, m;
int main(){
    cin >> m >> n;
    for(int i = 1; i <= m; i++) dp[i][1] = 1;
    for(int j = 1; j <= n; j++) dp[1][j] = 1;
    for(int i = 2; i <= m; i++) {
        for(int j = 2; j <= n; j++) {
         dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
     }
    } 
    cout << dp[m][n] << endl;
    return 0;
}
View Code

 

 

[传球游戏]

 

 

 

对于每一个同学接到球的来源可以是前一个同学,也可以是后一个同学,且还需要考虑传球次数,因此可以尝试设计状态:dp[i][j] 表示从 1 号开始传球,总共传递了 j 次,传递到 i 号的种类次数。例如 dp[1][0] 表示从 1 号开始传球传 0 次,到达 1 号。显而易见的 dp[1][0] = 1 。根据传球的来源不同,可以做如下划分:
从小编号传来:dp[i-1][j-1]
从大编号传来:dp[i+1][j-1]
因此 dp[i][j] = dp[i-1][j-1] + dp[i+1][j-1];

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
ll dp[50][50];
int n, m;
inline int backi(int i) { return i-1<=0? n : i-1; }
inline int nexti(int i) { return i+1>n? 1 : i+1; }
int main() {
    cin >> n >> m;
    dp[1][0] = 1;
    for (int j=1; j<=m; j++) {
        for (int i=1; i<=n; i++) {
            dp[i][j] = dp[backi(i)][j-1] + dp[nexti(i)][j-1];
        }
    } 
    cout << dp[1][m] << endl;
    return 0;
}
View Code

 

标签:11,main,05,int,U6,C++,long,include,dp
From: https://www.cnblogs.com/jayxuan/p/18032871

相关文章

  • C++U5-第05课-广度优先搜索2
    学习目标 广度优先搜索的思路复习 [【广度优先搜索(二)】图像渲染]  【题意分析】从需要上色的点开始,将所有与他相连接的点全部涂上相同的颜色【思路分析】我们从给定的起点开始,进行广度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该......
  • C++文件读取末尾空行问题
    起因是做gitlet读取文件内容时遇到的内容不匹配错误,后来发现是自己读取文件内容时均使用getline函数,写回时读入的每个字符串都加上换行符,导致文件末尾可能多出换行符。于是改成了vector<string>Blob::readContentsForBlob(conststring&file){vector<string>content;......
  • 05 锁
    数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。全局锁对整个数据库实例加锁,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表......
  • 05 Hello World
    05HelloWorld随便新建一个文件夹,存放代码新建一个java文件txt(文件后缀名为).javaHello.java【注意点】系统可能没显示文件后缀名,我们需要手动打开使用Notpad++编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("......
  • Python数据结构与算法05——归并排序
    归并排序:defmerge_sort(aimlist):#归并排序拆分-排序-合并也就是merge_返回的是是一个已经排好序的列表n=len(aimlist)ifn<=1:returnaimlistmid=n//2aimlist_left=merge_sort(aimlist[:mid])aimlist_right=merge_sort(aimlist[mid:......
  • 3. 无重复字符的最长子串C++
    思路就是从头开始找,然后每次在从重复节点的后一个找。classSolution{public:intlengthOfLongestSubstring(strings){inti=0,j=0,nowmax=1;intmax=1;if(s.size()==0||s.size()==1)returns.size();map<char,int>m;......
  • oracle指定控制文件启动 ORA-00205: error in identifying control file, check aler
    SQL>startupORACLEinstancestarted.TotalSystemGlobalArea1068937216bytesFixedSize2220200bytesVariableSize708841304bytesDatabaseBuffers352321536bytesRedoBuffers5554176bytesORA-00205:......
  • Java基础05:类型转换
    类型转换1.由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换低------------------------------------------------->高byte,short,char--->int--->long--->float--->double强制转换:由高类型转换到低类型  自动......
  • IIS PUT请求.netcore6.0接口 报HTTP Error 405 - Method Not Allowed
    在新的服务器上部署了一个.netcore的项目,部分请求地址使用了put、delete方式,导致无法正常请求,报Error405-MethodNotAllowed。由于配置IIS时把“WebDAV发布”给勾选了,所以会导致拦截。服务器和IIS10配置如下图:解决方案服务器上删除“WebDAV发布”1、打开“控制面......
  • C++ STL学习
    C++STL学习目录C++STL学习容器库概览对可以保存在容器中的元素的限制容器支持的操作所有容器都支持的操作或容器成员迭代器迭代器的公共操作迭代器的类型迭代器的const属性迭代器的操作类型迭代器范围使用左闭合区间的编程假定顺序容器顺序容器概述顺序容器的类型和特点确定使......