(总结一)poj简单动态规划.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档