首页 > 编程语言 >算法描述:动态规划

算法描述:动态规划

时间:2024-12-07 20:29:23浏览次数:5  
标签:动态 lcs int flag len 算法 bj include 描述

动态规划算法步骤:

  • 找出最优解的性质,刻画数据结构
  • 递归定义最优值
  • 自底向上计算出各子结构的最优值并添入表格中并保存
  • 以最优值构造最优解

最长公共子序列

递归结构:
eq?len%28i%2Cj%29%3D%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%200%5C%3A%20%5C%3A%20%5C%3A%20%5C%3A%20%5C%3A%20%5C%3A%20i%3D0%5C%3B%20or%20%5C%3B%20j%3D0%5C%5C%20len%28i-1%2Cj-1%29+1%5C%3B%20%5C%3B%20a_%7Bi%7D%3Db_%7Bj%7D%3Dc%20%5C%5C%20max%5Blen%28i-1%2Cj%29%2Clen%28i%2Cj-1%29%5D%20%5Cend%7Bmatrix%7D%5Cright.

int LCSlength(char*a,char*b,int**len,int**flag)
//a,b输入字符串,输出数组len的元素len[i][j]记录len(i,j),
//数组flag在求a、b的最长公共子序列时作为标志使用
//flag[i][j]=0 表示lcs(ai,bj)=lcs(ai-1,bj-1)||a[i],a[i]=b[j]
//flag[i][j]=1 表示lcs(ai,bj)=lcs(ai-1,bj)
//flag[i][j]=-1 表示lcs(ai,bj)=lcs(a,bj-1)
{
    n = strlen(a);m=strlen(b);
    for(int i =1;i<=n;i++)len[i][0]=0;
    for(int i =1;i<=m;i++)len[0][i]=0;
    for(int i =1;i<=n;i++)
      for(int j =1;j<=m;j++)
       {
          if(a[i]==b[j])
              {
                   len[i][j]=len[i-1][j-1]+1;
                   flag[i][j]=0;

              }
          else if(len[i-1][j] >= len[i][j-1])       
                 {
                      len[i][j] = len[i-1][j];
                      flag =1;
                 }
          else{
                len[i][j]=len[i][j-1];
                flag[i][j]=-1;
              }
     return(len[n][m]);
}

机器分配

描述

总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define N 30
#define MOD 2520
#define E 1e-12
using namespace std;
int a[N][N],f[N][N],res[N][N];
void print(int x,int y)
{
     if(x==0)
          return;
     print(x-1,y-res[x][y]);
     printf("%d %d\n",x,res[x][y]);
}
int main(){
      int n ,m;
      cin>>n>>m;
      for(int i =1;i<=n;i++) 
         for(int j =1;j<=m;j++)
              cin>>a[i][j];
      for(int i=1;i<=n;i++)
          for(int j =1;j<=m;j++)
              for(int k =0;k<=j;k++)
                   if(f[i][j] <=f[i-1][j-k]+a[i][k])
                    {
                         f[i][j]= f[i-1][j-k]+a[i][k];
                          res[i][j]=k;
                     }
       cout<<f[n][m]<<endl;
       print(n,m);
       return 0;
}

与分治法相比,都是分解为若干的子问题再递归求解,但是动态规划的子问题彼此并不独立。

能应用动态规划求解的问题应具有最优子结构性质。

 

标签:动态,lcs,int,flag,len,算法,bj,include,描述
From: https://blog.csdn.net/2302_76854318/article/details/144288077

相关文章

  • 算法积累
    计算最大数   对数组进行排序,取最大的n个数和(最大数*(绝对值乘积最大的数)),两者取最大值即为最大数。/***題目:求一个整数数组中的三个数最大乘积*思路:若全是正數,則数组按顺序排序后,最大三个数的乘积即为最大值*若全是负数,同样最大三个数的乘积即......
  • 详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式
    地下城游戏题目链接:174.地下城游戏状态表示:按照以往题的表示,dp[i][j]表示:从起点(0,0)位置到达(i,j)位置时,所需的最小初始健康值。但是如果这么去表示,不仅要考虑到达(i,j)位置的最小初始健康值,由于魔法球的存在,还需要考虑到达(i,j)位置时的健康值,因为魔法球会对算后续位置的最小初始......
  • 【推荐算法】推荐系统中的特征工程
    前言:这篇文章是阅读石塔西《互联网大厂推荐算法实战》第二章推荐系统中的特征工程的学习笔记,在未来对于特征向量的学习笔记会在此基础上进行补充。编者认为特征工程已经过时的言论是错误的,该言论认为DNN模型可以自主的完成对数据特征的提取,但是在DeepCrossNetwork网络中,作者直......
  • 欧几里得算法 & 扩展欧几里得算法
    一、欧几里得算法欧几里得算法,也叫辗转相除,简称gcd,用于计算两个整数的最大公约数引理:\(\gcd(a,b)=\gcd(b,a\%b)\)证明:设\(r=a%b\),\(c=gcd(a,b)\)则\(a=xc\),\(b=yc\),其中\(x,y\)互质\(r=a\%b=a-pb=xc-pyc=(x-py)c\)......
  • 堆栈实验--KMP算法
     求next数组的思想:最长公共前后缀什么是字符串前后缀呢,比如一个字符串aba,a可以是前缀,ab也可以是,但aba不是(也有资料说是但在kmp我们不认为),同样的,a(最后的a)是后缀,ba也是。求next数组,以ababa为例,若字符数组以0开始,第一位我们默认为-1,即a b a b a-1求第二位,则......
  • 编写一个冒泡算法,对10个整数进行排序
    #include<iostream>//冒泡排序函数voidbubbleSort(intarr[],intn){for(inti=0;i<n-1;++i){for(intj=0;j<n-1-i;++j){if(arr[j]>arr[j+1]){//交换相邻元素inttemp......
  • 【mybatis】动态SQL
    目录一、动态SQL的简述二、动态sql的使用1.标签---(注意:username和sex必须一个为空)2.--标签3.、标签--用来组装update语句4.、和标签5.标签①、用trim改写上面第二点的if+where语句 ②、用trim改写上面第三点的if+set 语句6.标签①:批量删除 ②......
  • Windows环境下,动态链接库(DLL)的“导入”与“导出”概念
    在软件开发中,特别是在使用动态链接库(DLL)的Windows环境下,"导入"(Import)和"导出"(Export)是两个关键概念,用于管理函数和变量在DLL之间的可见性和可用性。导出 (Export)当你创建一个DLL时,你可能会希望在这个DLL中定义一些函数或变量,使得其他的程序(客户端程序)或者其他的DLL能够调用或......
  • 栈和队列的应用 ——球钟算法
    栈和队列的应用——球钟算法1.球钟背景球钟是一个利用球的移动来记录时间的简单装置它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器若分钟指示器中有两个球,五分钟指示器有六个球,小时指示器有五个球,那就代表时间是5:322.工作原理每过一分钟球钟就......
  • 接龙数列(第十四届蓝桥杯C++B组JAVA题解 动态规划)
    对于一个长度为 KK 的整数数列:A1,A2,...,AK,我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字(2≤i≤K)。例如 12,23,35,56,61,11是接龙数列;12,23,34,56不是接龙数列,因为 56的首位数字不等于 3434 的末位数字。所有长度为 11 的整数数列都......