poj3176

动态规划dp;

方法一(超时): 
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=500;
int d[maxx][maxx];
int a[maxx][maxx];
int n,m;
int dfs(int x,int y){
	if(d[x][y]==0){
		d[x][y]=a[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));
	}
	return d[x][y];
}
int main(){
	while(cin>>n){
		memset(d,0,sizeof(d));
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=i;j++){
				cin>>a[i][j];
				if(i==n){
					d[i][j]=a[i][j];
				}
			}
		}
		int maxsum=dfs(1,1);
		cout<<maxsum<<endl;
	}
	return 0;
} 
方法二:(从下往上) 
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=390;
int d[maxx][maxx];
int a[maxx][maxx];
int n,m;
int main(){
	while(cin>>n){
		memset(d,0,sizeof(d));
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=i;j++){
				cin>>a[i][j];
				if(i==n){
					d[i][j]=a[i][j];
				}
			}
		}
		for(int i=n-1;i>=1;i--){
			for(int j=1;j<=i;j++){
				d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
			}
		}
		cout<<d[1][1]<<endl;
	}
	return 0;
} 
方法三:(从上往下)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=390;
int d[maxx][maxx];
int a[maxx][maxx];
int n,m;
int main(){
	while(cin>>n){
		memset(d,0,sizeof(d));
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=i;j++){
				cin>>a[i][j];
			}
		}
		d[1][1]=a[1][1]; 
		for(int i=2;i<=n;i++){
			for(int j=1;j<=i;j++){
				d[i][j]=a[i][j]+max(d[i-1][j],d[i-1][j-1]);
			}
		}
		int maxin=0;
		for(int i=1;i<=n;i++){
			if(maxin<d[n][i]){
				maxin=d[n][i];
			}
		}
		cout<<maxin<<endl;
	}
	return 0;
} 
上一篇:int i=0x3f3f3f是什么意思?


下一篇:DFS(深度搜索)