- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(总结一)poj简单动态规划
例1:求一维数组中连续数之和的最大值。
代码:
#includeiostream
using namespace std;
int a[100];//记录一维数组
int res[100];//res[i]表示以第i个数为末尾的连续数之和的最大值
int main(){
int i,n,max;
while(1){
cinn;
if(!n) break;
memset(res,0,sizeof(a)),max=-1270000;
for(i=0;in;i++){
cina[i];
res[i]=a[i];
if(i0 res[i-1]0) res[i]+=res[i-1];//动态规划法
if(res[i]max) max=res[i];//打擂法
}
coutmaxendl;
}
return 0;
}
例2(poj1050):求二维数组中子矩阵之和的最大值。(例1的拓展)
代码:
#includeiostream
using namespace std;
int a[101][101];//记录二维数组
int sum[101][101];//sum[i][j]表示第j列前i行的数之和
int res[101][101][101];//res[i1][i2][j]表示从第i1行到第i2行,以第j个数为末尾的连续数之和的最大值
int main(){
int i,i1,i2,j,n,temp,max;
while(1){
cinn;
if(!n) break;
memset(sum,0,sizeof(sum)),memset(res,0,sizeof(res));
for(i=1;i=n;i++)
for(j=1;j=n;j++){
cina[i][j];//输入二维数组
sum[i][j]=sum[i-1][j]+a[i][j];//求第j列前i行之和
}
max=-1270000;
for(i1=1;i1=n;i1++)//类似一维数组求最大和的方法,将一重循环改为三重循环
for(i2=i1;i2=n;i2++)
for(j=1;j=n;j++){
res[i1][i2][j]=sum[i2][j]-sum[i1-1][j];//相当于一维数组中的第j 个数
if(res[i1][i2][j-1]0) res[i1][i2][j]+=res[i1][i2][j-1];
if(res[i1][i2][j]max) max=res[i1][i2][j];
}
coutmaxendl;
}
return 0;
}
例3(poj1458):求最长公共子序列的长度。
代码:
#includeiostream
#includestring
using namespace std;
int res[500][500];//res[i][j]表示s1中第i个字符、s2中第j个字符之前的最长公共子序列长度
int max(int a,int b){return ab?a:b;}
int main(){
int i,j,n1,n2;
string s1,s2;
while(1){
cins1s2;
memset(res,0,sizeof(res)),n1=s1.length(),n2=s2.length();
for(i=0;in1;i++)
for(j=0;jn2;j++){
if(s1[i]==s2[j]) res[i+1][j+1]=res[i][j]+1;//动态规划法
else res[i+1][j+1]=max(res[i][j+1],res[i+1][j]);
}
coutres[n1][n2]endl;
}
return 0;
}
例4(poj1163):求三角形内可取得的最大和。
#includeiostream
using namespace std;
int a[101][101];
int res[101][101];//res[i][j]表示从顶端到达位置(i,j)所取得的最大值
int Max(int a,int b){return ab?a:b;}
int main(){
int i,j,n,max;
cinn;
while(n){
for(i=0;in;i++)//输入数据
for(j=0;j=i;j++)
cina[i][j];
res[0][0]=a[0][0];
for(i=1;in;i++) res[i][0]=res[i-1][0
您可能关注的文档
最近下载
- 湘美版(2024)七上 2.凝聚的力量 课件.pptx
- (完整)服装缝纫工初级理论知识试卷.pdf VIP
- 中国脑卒中护理指导规范.pptx VIP
- 2015最新七年级上册英语《Unit1What-does-he-look-like》课件(鲁教版)-(一).ppt VIP
- 资源综合利用企业耗用废弃原料占比及产品产销情况表.docx
- 附件1 国家重点研发计划课题绩效自评价报告模板(2019).doc VIP
- 《出纳实务》教学教案.doc VIP
- 小学中秋节安全教育主题班会.pptx
- 2024年湖北省襄阳襄城区事业单位统一公开招聘33人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- (部编)八年级上册第二单元教案教学设计.doc
文档评论(0)