第三章作业

1.动态规划:我觉得动态规划是一种比一般递归好一点的方法,如果递归的函数有n个参数那个就对应n维的数组。他通过把原问题分解为很多子问题,在确定各个子问题的最优解之和得出最终的最优解。并且解子问题的时候还要进行一些“记忆”。

DP还要针对特定的题目比如

 1) 问题具有最优子结构性质。如果问题的最优解所包含的 子问题的解也是最优的,我们就称该问题具有最优子结 构性质。

    2) 无后效性。当前的若干个状态值一旦确定,则此后过程的演变就只和这若干个状态的值有关,和之前是采取哪种手段或经过哪条路径演变到当前的这若干个状态,没有关系

2.第一题没有用递归

第二题

m[1]=0;
int min;
for(i=2;i<=n;i++)
{
min=cost[1][i];
for(j=1;j<=i-1;j++)
{
if(cost[j][i]!=0 && m[j]+cost[j][i]<min)
min=m[j]+cost[j][i];
}
m[i]=min;
}

 

3.结对编程情况:我和许世顺第一题都是用了自己想出来的办法做的,运行结果对的上然而都是得了10分,我们一开始对这个题目还是不懂得,不知道和课内怎么相关,看了网上解释之后其实也还是半知不解,这道题目我们最终保留了自己的做法,就是

#include<stdio.h>
#include <iostream>
using namespace std;
int main() {
int max = 0, count ,n ;
int b, c;
int a[n] ;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for (int i = 0; i < n; i++) {
b = a[i];
count=1;
for (int j = i + 1; j < n; j++) {
if (b < a[j]) {
b = a[j];
count++;
}

}
if (max < count) {
max = count;
}

}cout<<max;
}

第二题针对游艇问题,我们画出了矩阵图之后,再看了看书,就明白了这题是DP问题,很快就模仿树上的写法跑出了程序,并且代码只有30行:

#include <iostream>
using namespace std;
#define N 210
int cost[N][N];
int m[N];

int main()
{
int n,i,j;
while(cin>>n)
{
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
cin>>cost[i][j];
m[1]=0;
int min;
for(i=2;i<=n;i++)
{
min=cost[1][i];
for(j=1;j<=i-1;j++)
{
if(cost[j][i]!=0 && m[j]+cost[j][i]<min)
min=m[j]+cost[j][i];
}
m[i]=min;
}
cout<<m[n]<<endl;
}
return 0;
}

posted on 2018-10-29 19:13  suanfasfather  阅读(108)  评论(0编辑  收藏  举报

导航