数字三角形
2015-12-30 22:41
344 查看
数字三角形必须经过某一个点,使之走的路程和最大
输入格式:
第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点
输出格式:
输出最大值
输出:
输入格式:
第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点
输出格式:
输出最大值
样例1
输入:2 1 1 1 1 1
输出:
2
//11 月 23 日 2015 #include <stdio.h> int num[26][26];//存储数字三角形的权值 int route[26][2];//记录临时最优路径 int n; int s1,s2;//以特殊点分为上半段和下半段,分别求其最大值 int f; int x,y; void UpBacktrack(int i,int j) { int k; if(i == 0) { f = 0; for(k=1;k<x;k++) f += num[route[k][0]][route[k][1]]; if(f > s1) s1 = f; return; } else{ //记录路径 route[i][0] = i; route[i][1] = j; } if(j == 1) UpBacktrack(i-1,j); else if(j == i){ UpBacktrack(i-1,j-1); } else{ for(k=0;k<=1;k++)//2叉 UpBacktrack(i-1,j-k); } } void DownBacktrack(int i,int j) { int k; if(i > n) { f = 0; for(k=x+1;k<=n;k++) f += num[route[k][0]][route[k][1]]; if(f > s2) s2 = f; return; } else{ //记录路径 route[i][0] = i; route[i][1] = j; } for(k=0;k<=1;k++)//2叉 DownBacktrack(i+1,j+k); } int main() { int i,j; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=i;j++) scanf("%d",&num[i][j]); scanf("%d%d",&x,&y); //从特定点开始向上和向下回溯,保证两次回溯都得到最大路径权值 UpBacktrack(x,y); DownBacktrack(x,y); printf("%d\n",s1+s2+num[x][y]);//加上必须经过的点的权值 return 0; }
相关文章推荐
- [二]SpringMvc实践-注解
- java 数组复制
- Jmeter-java请求执行报错:java.lang.NoSuchFieldError: INSTANCE
- java常用建模工具汇总
- shopex备份
- LinkedHashMap分析
- 菜鸟猿大战Java之IO系列(二)
- css媒体查询之device-width
- hibernate(十)双向关联关系的CRUD
- poll调用深入解析
- 编写高性能的 Swift 代码
- HBase简介
- 在OpenCV3.1.0中使用SIFT,SURF算法
- OkHttp的使用
- 使用curl查看网页源码/自动跳转/显示头信息/显示通信过程/发送表单信息/文件上传/Referer字段/User Agent
- 面试题37:把数组排成最小的数
- C开源项目
- iOS开发-NSOperation与GCD区别
- Nginx配置性能优化的方法
- 关于 JAVA wait()和notify()