头歌实验七 动态规划

本关任务:编写用动态规划解决数塔问题。

相关知识

为了完成本关任务,你需要掌握:动态规划。

编程要求

头歌实验七 动态规划_第1张图片

求上图从顶层到顶层的一个路径,使路径上的数字和最大。要求输出最大的数字和max和数值和最大的路径。

#include  
#define N 5 //问题规模
int main() {
	int a[50][50];
	a[1][1] = 9;
	a[2][1] = 12, a[2][2] = 15;
	a[3][1] = 10, a[3][2] = 6, a[3][3] = 8;
	a[4][1] = 2, a[4][2] = 18, a[4][3] = 9, a[4][4] = 5;
	a[5][1] = 19, a[5][2] = 7, a[5][3] = 10, a[5][4] = 4, a[5][5] = 16;

	int i, j, dp[50][50] = { 0 }, path[50][50] = { 0 };
	for (j = 1; j <= N; j++)                           //初始子问题 ,倒数第二层(第i-1层)开始
		dp[N][j] = a[N][j];
	for (i = N - 1; i >= 1; i--)                       //进行第 i+1 层的决策,从i 到 1 向上
		for (j = 1; j <= i+1; j++) {                     //每一层有 i+1 个
			if (dp[i + 1][j] > dp[i + 1][j + 1]) {
				dp[i][j] = a[i][j] + dp[i + 1][j];
				path[i][j] = j;                        //本次决策选择下标j的元素
			}
			else {
				dp[i][j] = a[i][j] + dp[i + 1][j + 1];
				path[i][j] = j + 1;                     //本次决策选择下标j+1的元素
			}
		}
	printf("max=%d\n", dp[1][1]);
	printf("数值和最大的路径是:");            
	j = path[1][1];                          //计算dp[1][1]的选择
	for (i = 1; i < N; i++)
	{
		printf("%d->", a[i][j]);
		j = path[i][j];                         //计算dp[i][j]的选择
	}
	printf("%d\n", a[i][j]);
	
}


/********** End **********/

 

本关任务:编写用动态规划解决最长公共子序列问题。

相关知识

为了完成本关任务,你需要掌握:动态规划。

编程要求

求字符串序列“ABCDBAB”和“BDCABA”的最长公共子序列

#include 
#include 
int dp[100][100];
char a[100];
char b[100];
int maxm(int m,int n){
	if(m>n) return m;
	else return n;
}
int main(){
	scanf("%s",a);
	scanf("%s",b);
	int m=strlen(a);
	int n=strlen(b);
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(a[i-1]==b[j-1]){
				dp[i][j]=dp[i-1][j-1]+1;
			}
			else{
				dp[i][j]=maxm(dp[i-1][j],dp[i][j-1]);
			}
		}
	}
	//bnchdn
	//chdn
	printf("%d",dp[m][n]);
} 

/********** End **********/

本关任务:编写用动态规划解决最大子段和问题。

相关知识

为了完成本关任务,你需要掌握:动态规划。

编程要求

给定由n个整数(可能为负数)组成的序列:a1,a2,……,an, 求该序列的最大子段和。当所有整数均为负数,定义其最大子段和为0。

#include 
/********** Begin **********/
int main(){
	int n;
	scanf("%d",&n);
	int a[n][2];
	int max=0;
	for(int i=0;ia[i][0]?a[i-1][1]+a[i][0]:a[i][0];
		}
		
		max=max>a[i][1]?max:a[i][1];
		
	}
	printf("%d",max);
	return 0;
	
}
/********** End **********/

本关任务:编写用动态规划解决求最长的单调递增子序列长度问题。

相关知识

为了完成本关任务,你需要掌握:动态规划。

编程要求

给定一个长度为n的数组,找出一个最长的单调递增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为7的数组A5,6,7,1,2,8,9,则其最长的单调递增子序列为5,6,7,8,9,长度为5。求318714101223411624的最长的单调递增子序列长度。

#include 
/********** Begin **********/
int main(){
	 int n;
	 scanf("%d",&n);
	 int m[n][3];
	 m[0][1]=1;
	 m[0][2]=0;
	 for(int i=0;i=0){
				if(m[i][0]>m[k][0]){
						if(k==i-1){
							m[i][1]=m[k][1]+1;
							m[i][2]=k;
						}
						else{
							int max=m[k][1]+1;
							if(max>m[i][1]){
								m[i][1]=max;
								m[i][2]=k;	
							}
					    }
				}
			 k--;
			}
			if(k<0&&m[i][1]==0){
			    m[i][1]=1;
			    m[i][2]=i;
			}
		}
	 }

	int max=m[0][1],j=0;
	for(int i=0;i=max){
	             max=m[i][1];
	             j=i;
	      }
	 }
	printf("%d\n",max);


}
/********** End **********/

本关任务:编写用动态规划解决矩阵连乘问题。

相关知识

为了完成本关任务,你需要掌握:动态规划。

#include 
#include 
/********** Begin **********/
int main(){
	int n;
	scanf("%d",&n);
	int a[n][2];
	int b[n][n]={0};
	for(int i=0;i

你可能感兴趣的:(头歌实验算法,动态规划,算法)