欸嘛真的是老激动了,终于写出来了,时隔几天啊……好吧其实周末去了趟黑河……嘻嘻
数塔问题:dp算法
(第一次接触,真的是太帅了)
首先要好好看题!超级重要!
规则虽然是从上到下讲解的,但是结果要求的是整体最大,所以局部小点是没有关系的。
其次确定从下到上的策略:
两个数组(num保存原数据;Max保存累加后最大的值)
第一个循环:输入数据
第二个循环:在下一行确定的最大值正上面的三个数据中,选择最大的并累加
结果输出
Max[0][0];
附上Java代码:(oj不能过,文章后面解释)
import java.util.Scanner;
public class Main_1038 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int T,n,t=0;
int[][] max;
int[][] num;
while(input.hasNext()){
//三角形数
T=input.nextInt();
//每个三角形(行数)
for(int e=0;e<T;e++){
n = input.nextInt();
//初始化数组,每次保证都为0
max=new int[n+1][2*n+1];
num=new int[n+1][2*n+1];
for(int i=1;i<=n;i++){
for(int j=0;j<2*i-1;j++){
num[i-1][j] = input.nextInt();
}
}
//实验原数据
// for(int i=1;i<=n;i++){
// for(int j=0;j<2*i-1;j++){
// System.out.print(num[i-1][j]+" ");
// }
// System.out.println();
// }
//循环原数组每行,确定Max数值
for(int i=n;i>0;i--){
for(int j=0;j<2*i-1;j++){
if(max[i][j]>=max[i][j+1]&&max[i][j]>=max[i][j+2]){
max[i-1][j]=num[i-1][j]+max[i][j];
}else if(max[i][j+1]>=max[i][j]&&max[i][j+1]>=max[i][j+2]){
max[i-1][j]=num[i-1][j]+max[i][j+1];
}else if(max[i][j+2]>=max[i][j]&&max[i][j+2]>=max[i][j+1]){
max[i-1][j]=num[i-1][j]+max[i][j+2];
}
}
}
//查看max
// for(int i=1;i<=n;i++){
// for(int j=0;j<2*i-1;j++){
// System.out.print(max[i-1][j]+" ");
// }
// System.out.println();
// }
System.out.println(max[0][0]);
}
}
}
}
附上C++代码:
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
int T,n;
int Max[100][1000];
int num[100][1000];
while(cin>>T){
for(int e=0;e<T;e++){
cin>>n;
memset(num,0,sizeof(num));
memset(Max,0,sizeof(Max));
for(int i=1;i<=n;i++){
for(int j=0;j<2*i-1;j++){
cin>>num[i-1][j];
}
}
for(int i=n;i>0;i--){
for(int j=0;j<2*i-1;j++){
if(Max[i][j]>=Max[i][j+1]&&Max[i][j]>=Max[i][j+2]){
Max[i-1][j]=num[i-1][j]+Max[i][j];
}else if(Max[i][j+1]>=Max[i][j]&&Max[i][j+1]>=Max[i][j+2]){
Max[i-1][j]=num[i-1][j]+Max[i][j+1];
}else if(Max[i][j+2]>=Max[i][j]&&Max[i][j+2]>=Max[i][j+1]){
Max[i-1][j]=num[i-1][j]+Max[i][j+2];
}
}
}
cout<<Max[0][0]<<endl;
}
}
return 0;
}
后面来说一下自己的遭遇:
自己习惯用Java来编写题了,但是这道题一直显示内存或是时间超时。
网上大致查了一下,原因如下:
附上原文链接:
https://q.cnblogs.com/q/55899/
oj没办法过去,所以到最后自己又开始捡起C++,开始编写:(CodeBlocks)
大概记述下自己重新开始C++注意到的点,还有软件本身的东西:
- codeblocks注释快捷键
ctrl+shift+c注释
ctrl+shift+x取消注释 - c++输出结果出现乱码
数组未初始化;memset - 控制台一闪而过
先按齿轮再按绿色的键,不是红色的(看英文)
熟悉的人,太久没看到也陌生,
c++欸嘛,好好捡起来,oj提高效率挺好的。