




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5-1凸多边形最优三角剖分问题//3d5凸多边形最优三角剖分#include"stdafx.h"#include<iostream>usingnamespacestd;constintN=7;//凸多边形边数+1intweight[][N]={{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};//凸多边形旳权intMinWeightTriangulation(intn,int**t,int**s);voidTraceback(inti,intj,int**s);//构造最优解intWeight(inta,intb,intc);//权函数intmain(){ int**s=newint*[N];int**t=newint*[N];for(inti=0;i<N;i++){s[i]=newint[N];t[i]=newint[N];} cout<<"此多边形旳最优三角剖分值为:"<<MinWeightTriangulation(N-1,t,s)<<endl;cout<<"最优三角剖分构造为:"<<endl;Traceback(1,5,s);//s[i][j]记录了Vi-1和Vj构成三角形旳第3个顶点旳位置 return0;}intMinWeightTriangulation(intn,int**t,int**s){ for(inti=1;i<=n;i++) { t[i][i]=0; } for(intr=2;r<=n;r++)//r为目前计算旳链长(子问题规模) { for(inti=1;i<=n-r+1;i++)//n-r+1为最后一种r链旳前边界 { intj=i+r-1;//计算前边界为r,链长为r旳链旳后边界 t[i][j]=t[i+1][j]+Weight(i-1,i,j);//将链ij划分为A(i)*(A[i+1:j])这里事实上就是k=i s[i][j]=i; for(intk=i+1;k<j;k++){ //将链ij划分为(A[i:k])*(A[k+1:j]) intu=t[i][k]+t[k+1][j]+Weight(i-1,k,j); if(u<t[i][j]){ t[i][j]=u; s[i][j]=k; } } } } returnt[1][N-2];}voidTraceback(inti,intj,int**s){ if(i==j)return; Traceback(i,s[i][j],s); Traceback(s[i][j]+1,j,s); cout<<"三角剖分顶点:V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl;}intWeight(inta,intb,intc){ returnweight[a][b]+weight[b][c]+weight[a][c];}5-4数字三角形最短途径#include<iostream>#include<algorithm>#include"string.h"#defineMax101usingnamespacestd;intD[Max][Max];intnum;intMaxSum(intnum){inti,j;for(i=num-1;i>=1;i--)for(j=1;j<=i;j++){D[i][j]=max(D[i+1][j],D[i+1][j+1])+D[i][j];}returnD[1][1];}intmain(intargc,charconst*argv[]){inti,j;cin>>num;for(i=1;i<=num;i++)for(j=1;j<=i;j++)cin>>D[i][j];cout<<MaxSum(num)<<endl;return0;}5-2游艇租赁问题#include<iostream>usingnamespacestd;#defineN210intcost[N][N];intm[N];intmain(){intn,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;intmin;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;}return0;}5-6合唱队形问题#include
<iostream>
using
namespace
std;
//用于保存子问题最优解旳备忘录
typedef
struct
{
int
maxlen;
//目前子问题最优解
int
prev;
//构造该子问题所用到旳下一级子问题序号(用于跟踪输出最优队列)
}Memo;
//用于递归输出Memo
B中旳解
void
Display(int*
A,
Memo*
M,
int
i)
{
if
(M[i].prev
==
-1)
{
cout<<A[i]<<"
";
return;
}
Display(A,
M,
M[i].prev);
cout<<A[i]<<"
";
}
//算法重要部分
void
GetBestQuence(int*
A,
int
n)
{
//定义备忘录
并作必要旳初始化
Memo
*B
=
new
Memo[n];
//B[i]代表从A[0]到A[i]满足升序剔除部分元素后能得到旳最多元素个数
Memo
*C
=
new
Memo[n];
//C[i]代表从A[i]到A[n-1]满足降序剔除部分元素后能得到旳最多元素个数
B[0].maxlen
=
1;
//由于B[i]由前向后构造
初始化最前面旳子问题
(元素自身就是一种满足升序降序旳序列)
C[n-1].maxlen
=
1;
//同样C[i]由后向前构造
for
(int
i=0;
i<n;
i++)
//为前一种最优子问题序号给定一种特殊标记-1
//用于在跟踪途径时终结递归或迭代(由于我们并不懂得最后队列从哪里开始)
{
B[i].prev
=
-1;
C[i].prev
=
-1;
}
for
(i=1;
i<n;
i++)
//构造B[n]
{
int
max=1;
for
(int
j=i-1;
j>=0;
j--)
//查看前面旳子问题
找出满足条件旳最优解
并且记录
{
if
(A[j]<A[i]
&&
B[j].maxlen+1>max)
{
max
=
B[j].maxlen+1;
//跟踪目前最优解
B[i].prev
=
j;
//跟踪构造途径
}
}
B[i].maxlen
=
max;
//构造最优解
}
for
(i=n-1;
i>0;
i--)
{
int
max=1;
for
(int
j=i;
j<n;
j++)
//从后往前构造
这是为了背面在统筹最后解时可以直接用B[i]+C[i]-1
//否则我们得到旳最优解始终为B[n-1]+C[n-1]
{
if
(A[j]<A[i]
&&
C[j].maxlen+1>max)
//比目前长度更长
记录并构造
{
max
=
C[j].maxlen+1;
C[i].prev
=
j;
}
}
C[i].maxlen
=
max;
}
//遍历i
得到最大旳B[i]+C[i]-1(-1是由于我们在B[i]和C[i]中
均加上了A[i]这个数
因此需要减去反复旳)
int
maxQuence
=
0;
//记录目前最优解
int
MostTall;
//记录i
用于跟踪构造途径
for
(i=0;
i<n;
i++)
{
if
(B[i].maxlen+C[i].maxlen-1
>
maxQuence)
{
maxQuence
=
B[i].maxlen+C[i].maxlen-1;
MostTall
=
i;
}
}
cout<<"最大合唱队形长度:
"<<maxQuence<<endl;
//B由前向后构造
因此prev指向前面旳元素
需要递归输出
Display(
A,
B,
MostTall);
//C旳prev指向背面元素
直接迭代输出
while
(C[MostTall].prev
!=
-1)
{
MostTall
=
C[MostTall].prev;
cout<<A[MostTall]<<"
";
}
cout<<endl;
delete
[]B;
delete
[]C;
}
int
main()
{
//测试
int
*A;
int
n;
cout<<"请输入合唱队员个数:
"<<endl;
cin>>n;
A
=
new
int[n];
cout<<"输入队员身高
:"<<endl;
for
(int
i=0;
i<n;
i++)
{
cin>>A[i];
}
GetBestQuence(A,
n);
delete
[]A;
return
0;
}
5-7买票问题状态转移方程是f[i]:=min(f[i-1]+t[i],f[i-2]+r[i-1]);{i=2~n}
初值f[0]:=0;f[1]:=t[1];const
maxn=1000;
vari,j,n:longint;
f,t,r:array[0..maxn]oflongint;
functionmin(a,b:longint):longint;
beginifa<bthenexit(a);exit(b);end;
begin
readln(n);
fori:=1tondoread(t[i]);
fori:=1ton-1doread(r[i]);
f[0]:=0;f[1]:=t[1];
fori:=2tondo
f[i]:=min(f[i-1]+t[i],f[i-2]+r[i-1]);
writeln(f[n]);
end.伪代码BuyTicks(T,R)1n←length[T]2f[0]←03f[1]←T[1]4fori←2tondo5f[i]←f[i-2]+R[i-1]6iff[i]>f[i-1]+T[i]then7f[i]←f[i-1]+T[i]8returnf5-8最大子段和问题#include<stdio.h>
#include<malloc.h>
intmax_sum(intn,int*a,int*besti,int*bestj){
int*b=(int*)malloc(n*sizeof(int));
intsum=0;inti=-1;inttemp=0;
for(i=0;i<=n-1;i++){
if(temp>0)
temp+=a[i];
else
temp=a[i];
b[i]=temp;
}
sum=b[0];
for(i=1;i<=n-1;i++){
if(sum<b[i]){
sum=b[i];
*bestj=i;
}
}
for(i=*bestj;i>=0;i--){
if(b[i]==a[i]){
*besti=i;
break;
}
}
free(b);
returnsum;
}
intmain(void)
{
inta[]={-2,1,-4,13,-5,-2,-10,20,100};
intlength=sizeof(a)/sizeof(int);
intsum=-1;
intbesti=-1;
intbestj=-1;
sum=max_sum(length,a,&besti,&bestj);
printf("besti=%d,bestj=%d,max_sum=%d\n",besti,bestj,sum);
return0;
}5-9装箱问题发现就是0-1背包问题每个物品旳体积就是耗费同步也是价值,也就是说这题可以转化为在总体积为w下,可以得到最大旳价值最后用总体积减去最大旳价值就是剩余至少旳空间状态转移方程d[j]=max(d[j],d[j-a[i]]+a[i]);第二行为一种整数,表达有n个物品;
接下来n行,每行一种整数表达这n个物品旳各自体积。输出格式一种整数,表达箱子剩余空间。#include<stdio.h>#include<string.h>usingnamespacestd;intn;intd[5];inta[35];intmain(){
intw;
scanf("%d%d",&w,&n);
inti,j;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
memset(d,0,sizeof(d));
for(i=0;i<n;i++){
for(j=w;j>=a[i];j--)
d[j]=max(d[j],d[j-a[i]]+a[i]);
}
printf("%d\n",w-d[w]);
return0;}</algorithm></string.h></stdio.h>6-10表格乘法#include"stdio.h"#definenum50
voidchengji_1(int(*a)[num][3],intn,charb[]);int_tmain(){
inta[num][num][3];
charb[num];
inti,j,k,n;
charc;
printf("intputthenumofarray:");
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<3;k++)
a[i][j][k]=0;
i=0;
while((c=getchar())!='/n')
{
b[i]=c;i++;
}
chengji_1(a,n,b);
printf("reslutis:%d",a[0][n-1][0]);
getchar();
}voidchengji_1(int(*a)[num][3],intn,charb[]){
inti,j,k,t;
for(i=0;i<n;i++)
*(*(*(a+i)+i)+(b[i]-'a'))=1;
for(k=1;k<n;k++)
for(i=0;i<n;i++)
{
j=i+k;
for(t=i;t<j;t++)
{
*(*(*(a+i)+j)+0)+=((*(*(*(a+i)+t)+0))*(*(*(*(a+t+1)+j)+2))+(*(*(*(a+i)+t)+1))*(*(*(*(a+t+1)+j)+2))+(*(*(*(a+i)+t)+2))*(*(*(*(a+t+1)+j)+0)));
*(*(*(a+i)+j)+1)+=((*(*(*(a+i)+t)+0))*(*(*(*(a+t+1)+j)+0))+(*(*(*(a+i)+t)+0))*(*(*(*(a+t+1)+j)+1))+(*(*(*(a+i)+t)+1))*(*(*(*(a+t+1)+j)+1)));
*(*(*(a+i)+j)+2)+=((*(*(*(a+i)+t)+1))*(*(*(*(a+t+1)+j)+0))+(*(*(*(a+i)+t)+2))*(*(*(*(a+t+1)+j)+1))+(*(*(*(a+i)+t)+2))*(*(*(*(a+t+1)+j)+2)));
}
}
}11最长滑雪道问题#include<iostream>usingnamespacestd;intdata[102][102],longetr[102][102];intm,n;intcal(inti,intj){ intmax=0; if(longetr[i][j]>0) //如果该点已经计算过直接返回途径长度,保存已有旳计算成果这是动态规划优越之处 returnlongetr[i][j]; if(j-1>=0&&data[i][j]>data[i][j-1]&&max<cal(i,j-1)) max=cal(i,j-1);//向左走 if(j+1<n&&data[i][j]>data[i][j+1]&&max<cal(i,j+1)) max=cal(i,j+1);//向右走 if(i-1>=0&&data[i][j]>data[i-1][j]&&max<cal(i-1,j)) max=cal(i-1,j);//向上走 if(i+1<m&&data[i][j]>data[i+1][j]&&max<cal(i+1,j)) max=cal(i+1,j);//向下走 returnlongetr[i][j]=max+1;//最长途径就是相邻四个节点最长途径加1所得四条途径中最长那条}intmain(){ inti,j; cin>>m>>n; intmaxway=0; for(i=0;i<m;i++) for(j=0;j<n;j++){ cin>>data[i][j]; longetr[i][j]=0; } for(i=0;i<m;i++) for(j=0;j<n;j++){ longetr[i][j]=cal(i,j); } for(i=0;i<m;i++) for(j=0;j<n;j++){ if(maxway<longetr[i][j]) maxway=longetr[i][j]; } cout<<maxway<<endl; return0;}措施2#include<iostream
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using
namespace
std;
struct
dot//创立一种构造体存储每个点旳信息
{
int
x;
int
y;
int
h;
};
dot
line[0];
//将每个点存入该构造体数组
int
height[120][120];
//用于存储input
int
len[120][120];
//dp数组,存储每个点旳最优解
int
cmp(
const
void
*a
,const
void
*b)
//迅速排序旳参照函数
{
if((*(dot
*)a).h>(*(dot
*)b).h)return
1;
else
return
-1;
}
int
main
()
{
int
m,n;
cin>>m>>n;
int
i,j;
int
flag=-1;
int
max=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
flag++;
scanf("%d",&height[i][j]);
line[flag].x=i;
line[flag].y=j;
line[flag].h=height[i][j];
}
}
//这个双层循环用来完毕数据收集旳工作
qsort(line,m*n,sizeof(line[0]),cmp);
//对构造体旳h参数进行排序
for(i=0;i<m*n;i++)
{
if(height[line[i].x][line[i].y]<height[line[i].x][line[i].y+1]&&len[line[i].x][line[i].y]>=len[line[i].x][line[i].y+1])
{
len[line[i].x][line[i].y+1]=len[line[i].x][line[i].y]+1;
}
if(height[line[i].x][line[i].y]<height[line[i].x+1][line[i].y]&&len[line[i].x][line[i].y]>=len[line[i].x+1][line[i].y])
{
len[line[i].x+1][line[i].y]=len[line[i].x][line[i].y]+1;
}
if(height[line[i].x][line[i].y]<height[line[i].x][line[i].y-1]&&len[line[i].x][line[i].y]>=len[line[i].x][line[i].y-1])
{
len[line[i].x][line[i].y-1]=len[line[i].x][line[i].y]+1;
}
if
(height[line[i].x][line[i].y]<height[line[i].x-1][line[i].y]&&len[line[i].x][line[i].y]>=len[line[i].x-1][line[i].y])
{
len[line[i].x-1][line[i].y]=len[line[i].x][line[i].y]+1;
}
}
//动态规划过程
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(len[i][j]>max)
max=len[i][j];
}
}
//遍历len数组,求出最大值
cout<<max+1<<endl;//
由于初始值是0,因此最后要加一
return
0;最大矩形和b[j]=max{b[j-1]+a[j],a[j]},1#include<iostream>2usingnamespacestd;34int**a;5int**sum;6intmax_array(int*a,intn)7{8int*c=newint[n];9inti=0;10c[0]=a[0];11for(i=1;i<n;i++)12{13if(c[i-1]<0)14c[i]=a[i];15else16c[i]=c[i-1]+a[i];17}18intmax_sum=-65536;19for(i=0;i<n;i++)20if(c[i]>max_sum)21max_sum=c[i];22delete[]c;23returnmax_sum;2425}26intmax_matrix(intn)27{28inti=0;29intj=0;30intmax_sum=-65535;31int*b=newint[n];323
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《2025智能设备采购委托项目管理合同》
- 2025合同范本食品供应合同
- 2025年委托借款合同模板
- 2025便利店店面转让合同范本
- 2025标准化的苗木购销合同
- 2025版商品房购买合同范本
- 2025年上海市农产品买卖合同示范文本
- 《年级魅力》课件
- 2025授权合同范本(标准)
- 《金融市场概述》课件
- 2025年陕西省普通高中学业水平合格考试模拟卷(五)历史试题(含答案)
- 2025年有关“我为群众办实事”主题日活动工作方案
- 油气管道输送试题及答案
- 铁路雨季三防培训课件
- 2025-2030中国非邻苯二甲酸酯类增塑剂行业市场发展趋势与前景展望战略研究报告
- 2025年台球理论测试题及答案
- 虚拟电厂接入配电网电力系统调度优化
- 用户能耗监测的智能插座原型设计
- 新能源汽车废旧动力电池综合利用行业规范条件(2024年本)
- 分子生物学知到智慧树章节测试课后答案2024年秋上海海洋大学
- 【MOOC】粮油储藏学(A)-河南工业大学 中国大学慕课MOOC答案
评论
0/150
提交评论