id=1163">链接:poj 1163

题意:输入一个n层的三角形。第i层有i个数,求从第1层到第n层的全部路线中。权值之和最大的路线。

规定:第i层的某个数仅仅能连线走到第i+1层中与它位置相邻的两个数中的一个。

状态方程:f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];

1163代码:

#include<stdio.h>
#include<string.h>
int a[105][105],f[105][105];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,n,k;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
memset(f,0,sizeof(f));
k=0;
f[1][1]=a[1][1]; //第一个数肯定要加
for(i=2;i<=n;i++){
for(j=1;j<=i;j++){
if(j==1) //在左边界时
f[i][j]=f[i-1][j]+a[i][j];
else if(j==i) //在右边界时
f[i][j]=f[i-1][j-1]+a[i][j];
else //不在边界时
f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];
}
}
for(i=1;i<=n;i++) //比較全部可能的大小
k=max(k,f[n][i]);
printf("%d\n",k);
}
return 0;
}

优化后:


#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,n,k,f[105][105];
while(scanf("%d",&n)!=EOF){
memset(f,0,sizeof(f)); //初始化为0
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&f[i][j]);
k=0;
for(i=2;i<=n;i++)
for(j=1;j<=i;j++)
f[i][j]+=max(f[i-1][j-1],f[i-1][j]); //由于在边界左右没数的地方都初始化为0了。加上后不会产生影响
for(i=1;i<=n;i++)
k=max(k,f[n][i]);
printf("%d\n",k);
}
return 0;
}

链接:poj 3176


3176与上题题意一样,仅仅需将数组开大点就过了,我开的 f[355][355]

最新文章

  1. Gevent中的同步与异步详解
  2. 用康托展开实现全排列(STL、itertools)
  3. 爷爷辈儿的AX
  4. [svn] linux 下svn服务器的搭建
  5. Qt5 Addin 出现问题模块计算机类型“x64”与目标计算机类型“X86”冲突
  6. 用Systemtap探索MySQL
  7. 如何在linux下解压缩rar和zip格式的文件压缩包
  8. vsftpd.conf 联机手册
  9. gridview外边距
  10. &lt;climits&gt;头文件使用方法
  11. Ural 1313 - Some Words about Sport
  12. css设置居中的方案总结
  13. spring cloud 入门系列六:使用Zuul 实现API网关服务
  14. .NetCore采取JWT方式进行身份认证
  15. C# 对文本文件的几种读写方法总结
  16. 【VIM】-NO.140.VIM.1 -【VIM】
  17. 咏南新BS开发框架
  18. 【PAT】1019 数字黑洞 (20)(20 分)
  19. Esper学习之八:EPL语法(四)
  20. 第五章 企业项目开发--mybatis注解与xml并用

热门文章

  1. idea中git分支的使用
  2. C++ 代码静态分析工具cppcheck【转】
  3. 利用github搭建个人网站
  4. LA 2995 Image Is Everything
  5. Java ArrayList 详解
  6. 好用的Python IDLE Sublime Text 3推荐
  7. Hibernate注解详解
  8. Unity -- 入门教程一
  9. 使用zerorpc踩的第一个坑:
  10. Git安装及SSH Key管理之Mac篇