poj 1163 The Triangle &poj 3176 Cow Bowling (dp)
2024-09-06 03:23:33
题意:输入一个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;
}
3176与上题题意一样,仅仅需将数组开大点就过了,我开的 f[355][355]
最新文章
- Gevent中的同步与异步详解
- 用康托展开实现全排列(STL、itertools)
- 爷爷辈儿的AX
- [svn] linux 下svn服务器的搭建
- Qt5 Addin 出现问题模块计算机类型“x64”与目标计算机类型“X86”冲突
- 用Systemtap探索MySQL
- 如何在linux下解压缩rar和zip格式的文件压缩包
- vsftpd.conf 联机手册
- gridview外边距
- <;climits>;头文件使用方法
- Ural 1313 - Some Words about Sport
- css设置居中的方案总结
- spring cloud 入门系列六:使用Zuul 实现API网关服务
- .NetCore采取JWT方式进行身份认证
- C# 对文本文件的几种读写方法总结
- 【VIM】-NO.140.VIM.1 -【VIM】
- 咏南新BS开发框架
- 【PAT】1019 数字黑洞 (20)(20 分)
- Esper学习之八:EPL语法(四)
- 第五章 企业项目开发--mybatis注解与xml并用