USACO1.5 Number Triangles(numtri)

        动态规划的基础题,状态转移方程dy(i,j)=a(i,j)+max{d(i+1,j),d(i+1,j+1)};利用记忆化搜索,简化计算过程。

 

/*
ID:jzzlee1
PROG:numtri
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("numtri.in");
ofstream fout("numtri.out");
int a[1001][1001],d[1001][1001];int n;
int dy(int i,int j)
{
	if(d[i][j]>=0)
		return d[i][j];
	return d[i][j]=a[i][j]+(i==n?0:(dy(i+1,j)>dy(i+1,j+1)?dy(i+1,j):dy(i+1,j+1)));
}
int main()
{
	memset(a,0,sizeof(a));
	memset(d,-1,sizeof(d));
	//cin>>n;
	fin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
			//cin>>a[i][j];
			fin>>a[i][j];
	for(int i=1;i<=n;i++)
		d[n][i]=a[n][i];
	//cout<<dy(1,1)<<endl;
	fout<<dy(1,1)<<endl;
	return 0;
}

你可能感兴趣的:(USACO)