算法作业实验三
/*105.最大字段和 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.
或者求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].
输入描述
第一行为一个整数n,表示数组有n个数据,第二行依次输入n个整数
输出描述
计算出n个整数中连续k个数的最大和
输入样例
5
1 2 3 4 5
7
6 -5 5 8 -13 5 7
输出样例
15
14
*/
#include<iostream> #include<stdio.h> using namespace std; const int maxn = 1e4+10; int a[maxn]; int dp[maxn][maxn]; int main(){ int n; cin>>n; for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ if(j==i) dp[i][j] = a[i]; else dp[i][j] =dp[i][j-1]+a[j]; } } int m=0; for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ m = max(m,dp[i][j]); } } cout<<m<<endl; return 0; }
/*326.0/1背包问题 (20分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
物品集合U={u1,u2…un},体积分别为s1,s2…..sn,价值分别为v1,v2….vn;容量C的背包。设计算法实现放入背包的物品价值最大。
输入描述
第一行输入物品数n,第二行输入每个物品体积,第三行输入每个物品的价值,第四行输入背包的容量C
输出描述
输出最大价值数。
输入样例
3
3 4 5
4 5 6
10
输出样例
11*/
#include<iostream> #include<stdio.h> using namespace std; const int maxn = 1e4+10; int s[maxn],v[maxn]; int C; int dp[maxn][maxn]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++) scanf("%d",&s[i]); for(int i=1;i<=n;i++) scanf("%d",&v[i]); cin>>C; for(int i=1;i<=n;i++){ for(int j=0;j<=C;j++){ if(j-s[i]>=0) dp[i][j] = max(dp[i][j],dp[i-1][j-s[i]]+v[i]); else dp[i][j] = dp[i-1][j]; } } int mm=0; for(int i=1;i<=n;i++){ for(int j=0;j<=C;j++) mm = max(mm,dp[i][j]); } cout<<mm<<endl; return 0; }
/*502.矩阵连乘最少计算量 (10分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
n个矩阵A1,A2,...,An, ,如果其维度分别为d0xd1, d1xd2, ...dn-1xdn,则可以进行连乘运算A1A2A3..An .
连乘运算可以采取不同的顺序进行,如(A1A2)A3 和 A1(A2A3),这两种顺序的消耗乘法计算量是不同的,前者是
d0.d1.d2+d0.d2.d3,后者d0.d1.d3+d1.d2.d3.
第1步选择哪两个,第2步又选择哪两个,一直到最后算出结果需要做n-1次决定。其中有一种计算顺序使得
A1A2A3..An总的乘法计算量最小。
输入描述
第一行输入n
第二行输入维度向量d0,d1,...dn
输出描述
输出所需的最少乘法次数。
输入样例
4
2 3 2 4 3
输出样例
48*/
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int maxn = 1e4+10; const int INF = 0x3f3f3f; int a[maxn]; int dp[maxn][maxn]; int main(){ int n; cin>>n; for(int i=0;i<=n;i++){ scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); for(int r=2;r<=n;r++){ for(int i=1;i<=n-r+1;i++){ int j = i+r-1; dp[i][j] = INF; for(int k = i;k<j;k++){ dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]); } } } cout<<dp[1][n]<<endl; return 0; }