上午一直在看别人的博客,看不懂,头疼,大神们都不写注释吗?
想了解一下动态规划和记忆化搜索,找到了这篇博文,费了半天劲大概把代码看懂了
数字三角形——递归、递推、记忆化搜索
第一个数据为正整数n,表示这组数据有n行,接下来是一组数字三角形
看完了递归做法,想自己手敲一下
真是费劲啊
#include<stdio.h>
int max(int x,int y);
int fun(int a,int b);
int tree[500][500],n;
int main(void)
{
while(scanf("%d",&n)!=EOF){//一共n行
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++){//第i行有i个数字
scanf("%d",&tree[i][j]);//读取三角形所有数据,第i行第j个数据
}
printf("%d\n",fun(1,1));
}
return 0;
}
int max(int x,int y);//比较两个数大小并返回较大的那个数
inline int max(int x,int y)
{
int ret;
ret=(x>y)?x:y;
return ret;
}
int fun(int a,int b)
{
return tree[a][b]+(a==n?0:max(fun(a+1,b),fun(a+1,b+1)));//穷举出所有分支,并从三角形底部处挑出较大的数字加上它的分支点数字,一直回推
}
我还是头一次把int变量声明写在main函数外,不这样做的话,fun()函数会报错。
写了有半个小时左右?之前看着真的费劲
我还是头一次费这么大力气研究递推和递归
等有空了再去看这篇博客,感觉写的很棒,不过有些地方有点小疑问
夜深人静写算法(二) - 动态规划
2019年1月25日14点23分
emm,今天在航电上水题,似乎又碰到这道题了……
题目 HDOJ-2084
#include<cstdio>
#include<iostream>
using namespace std;
int tower[100][100];
int dp[100][100];
int maxi(int a,int b);
int main()
{
int c;
cin>>c;
while(c--){
int n,i,j;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
cin>>tower[i][j];
dp[0][0]=tower[0][0];
for(i=1;i<n;i++)
for(j=0;j<=i;j++){
if(j==0)
dp[i][j]=dp[i-1][j]+tower[i][j];
else if(i==j)
dp[i][j]=dp[i-1][j-1]+tower[i][j];
else
dp[i][j]=maxi(dp[i-1][j]+tower[i][j],dp[i-1][j-1]+tower[i][j]);
}
int m=dp[n-1][0];
for(i=1;i<n;i++)
if(m<dp[n-1][i])
m=dp[n-1][i];
cout<<m<<endl;
}
return 0;
}
int maxi(int a,int b)
{
return (a>b)?a:b;
}
凭着感觉乱写的一个假DP,不过AC了……
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
---|---|---|---|---|---|---|---|---|
29397668 | 2019-06-07 09:03:43 | Accepted | 2084 | 171MS | 1880K | 699 B | C++ | Overstars |
29397666 | 2019-06-07 09:02:16 | Wrong Answer | 2084 | 171MS | 1872K | 695 B | C++ | Overstars |
2019年6月7日