《趣学算法》第四章 动态规划源代码

2021-03-29 15:27

阅读:513

标签:相关   遍历   字符   不用   std   ade   max   规模   绝对值   

动态规划相关代码实现:

目录
  • 动态规划相关代码实现:
    • 1、孩子有多像爸爸——最长的公共子序列
    • 2、DNA基因鉴定——编辑距离
    • 3、长江一日游——游艇租赁
    • 4、快速计算——矩阵连乘
    • 5、切呀切皮萨——最优三角剖分
    • 6、小石子游戏——石子合并
    • 7、大卖场购物车1——0-1背包问题
    • 8、快速定位——最优二叉搜索树

1、孩子有多像爸爸——最长的公共子序列

//program 4-1
#include 
#include
using namespace std;
const int N=1002;
int c[N][N],b[N][N];
char s1[N],s2[N];
int len1,len2;

void LCSL()
{
    int i,j;
    for(i = 1;i =c[i-1][j])
            {
                c[i][j] = c[i][j-1];
                b[i][j] = 2;
            }
            else
            {
                c[i][j] = c[i-1][j];
                b[i][j] = 3;
            }
        }
     }
}

void print(int i, int j)//根据记录下来的信息构造最长公共子序列(从b[i][j]开始递推)
{
    if(i==0 || j==0) return;
    if(b[i][j]==1)
    {
        print(i-1,j-1);
        cout> s1;
    cout > s2;
    len1 = strlen(s1);//计算两个字符串的长度
    len2 = strlen(s2);
    for(i = 0;i 

2、DNA基因鉴定——编辑距离

//program 4-2
#include 
#include 
using namespace std;
const int N=100;
char str1[N],str2[N];
int d[N][N]; //定义辅助数组,d[i][j]表示str1前i个字符和str2前j个字符的编辑距离。

int min(int a, int b)
{
    return a> str1;
    cout > str2;
    cout 

3、长江一日游——游艇租赁

//program 4-3
#include
using namespace std;
const int ms = 1000;
int r[ms][ms],m[ms][ms],s[ms][ms];    //i到j站的租金
int n;            //共有n个站点
void rent()
{
    int i,j,k,d;
    for(d=3;d> n;
    cout >r[i][j];
            m[i][j]=r[i][j];
        }
    rent();
    cout 

4、快速计算——矩阵连乘

//program 4-4
#include
#include
#include
using namespace std;
const int msize = 100;
int p[msize];
int m[msize][msize];
int s[msize][msize];
int n;

void matrixchain()
{
    int i,j,r,k;
    memset(m,0,sizeof(m));
    memset(s,0,sizeof(s));
    for(r = 2; r > n;
    int i ,j;
    cout > p[i];
    matrixchain();
    print(1,n);
    cout 

5、切呀切皮萨——最优三角剖分

//program 4-5
#include
#include
#include
#include
#include
using namespace std  ;
const int M= 1000 + 5 ;
int n ;
int s[M][M] ;
double m[M][M],g[M][M];
void  Convexpolygontriangulation()
{
    for(int i = 1 ;i  temp)
              {
                  m[i][j] = temp ;   // 更新最优值
                  s[i][j] = k ;      // 记录中间点
              }
          }
      }
}
void print(int i , int j)  // 输出所有的弦
{
    if(i == j)  return ;
    if(s[i][j]>i)
      couts[i][j]+1)
      cout> n;
    n-- ;
    cout >g[i][j] ;
    Convexpolygontriangulation();
    cout

6、小石子游戏——石子合并

//program 4-6
#include 
#include 
using namespace std;

const int INF = 1 max_Circular)
           max_Circular=Max[i][n+i-1];
    }
}

int main()
{
    int n;
    cout > n;
    cout >a[i];
    straight(a, n);
    cout
//program 4-6-1
#include 
#include 
using namespace std;

const int INF = 1 i?s[i][j-1]:i;
            int j1=s[i+1][j]Max[i][j-1])
               Max[i][j]=Max[i+1][j]+tmp;
            else
               Max[i][j]=Max[i][j-1]+tmp;
        }
    }
}

void straight(int a[],int n)
{
    for(int i=1;imax_Circular)
           max_Circular=Max[i][n+i-1];
    }
}

int main()
{
    int n;
    cout > n;
    cout >a[i];
    straight(a, n);
    cout

7、大卖场购物车1——0-1背包问题

//program 4-7
#include 
#include
#include
using namespace std;
#define maxn 10005
#define M 105
int c[M][maxn];//c[i][j] 表示前i个物品放入容量为j购物车获得的最大价值
int w[M],v[M];//w[i] 表示第i个物品的重量,v[i] 表示第i个物品的价值
int x[M];  //x[i]表示第i个物品是否放入购物车
int main(){
    int i,j,n,W;//n表示n个物品,W表示购物车的容量
    cout > n;
    cout > W;
    cout >w[i]>>v[i];
    for(i=1;i0;i--)
        if(c[i][j]>c[i-1][j])
        {
            x[i]=1;
            j-=w[i];
        }
        else
            x[i]=0;
    cout
//program 4-7
#include 
#include
using namespace std;
#define maxn 10005
#define M 105
int dp[maxn];//dp[j] 表示当前已放入容量为j的购物车获得的最大价值
int w[M],v[M];//w[i] 表示第i个物品的重量,v[i] 表示第i个物品的价值
int x[M];  //x[i]表示第i个物品是否放入购物车
int i,j,n,W;//n表示n个物品,W表示购物车的容量
void opt1(int n,int W)
{
     for(i=1;i0;j--)
            if(j>=w[i])  //当物品的重量大于购物车的容量,比较此物品放与不放是否能使得购物车内的价值最大
              dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}

void opt2(int n,int W)
{
     for(i=1;i=w[i];j--)
            //当物品的重量大于购物车的容量,比较此物品放与不放是否能使得购物车内的价值最大
           dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}

void opt3(int n,int W)
{
     int sum[n];//sum[i]表示从1...i的物品重量之和
     sum[0]=0;
     for(i=1;i=bound;j--)
            //当物品的重量大于购物车的容量,比较此物品放与不放是否能使得购物车内的价值最大
           dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
     }
}

int main()
{
    cout > n;
    cout > W;
    cout >w[i]>>v[i];
    for(j=1;j0;i--)
    {
        while(dp[j]==dp[j-1])
            j--;
        if(dp[j]

8、快速定位——最优二叉搜索树

//program 4-8
#include
#include   //求绝对值函数需要引入该头文件
using namespace std;
const int M=1000+5;
double c[M][M],w[M][M],p[M],q[M];
int s[M][M];
int n,i,j,k;
void Optimal_BST()
{
	for(i=1;i1E-6)//C++中浮点数因为精度问题不可以直接比较
				{
					c[i][j]=temp;
					s[i][j]=k;//k即为从下标i到j的根节点
				}
			}
			c[i][j]+=w[i][j];
		}
}
void Construct_Optimal_BST(int i,int j,bool flag)
{
	if(flag==0)
	{
		cout=j)
	{
		cout> n;
    cout>p[i];
    cout >q[i];
	Optimal_BST();
	// /*用于测试
	for(i=1; i
//program 4-8-1
#include
#include   //求绝对值函数需要引入该头文件
using namespace std;
const int M=1000+5;
double c[M][M],w[M][M],p[M],q[M];
int s[M][M];
int n,i,j,k;
void Optimal_BST()
{
	for(i=1;ii?s[i][j-1]:i;
            int j1=s[i+1][j]1E-6)//C++中浮点数因为精度问题不可以直接比较
				{
					c[i][j]=temp;
					s[i][j]=k;//k即为从下标i到j的根节点
				}
			}
			c[i][j]+=w[i][j];
		}
}
void Construct_Optimal_BST(int i,int j,bool flag)
{
	if(flag==0)
	{
		cout=j)
	{
		cout> n;
    cout>p[i];
    cout >q[i];
	Optimal_BST();
	// /*用于测试
	for(i=1; i

《趣学算法》第四章 动态规划源代码

标签:相关   遍历   字符   不用   std   ade   max   规模   绝对值   

原文地址:https://www.cnblogs.com/self-confidence/p/13604463.html


评论


亲,登录后才可以留言!