poj——3176
2015-06-18 13:03 HaodongGUO 阅读(151) 评论(0) 收藏 举报#include <iostream>
#include<cstdio>
#include<cstdlib>
//#include<memory.h>
#include<string.h>
#include<algorithm>
using namespace std;
int s[360][360];
int dfs(int x,int y,int n)
{
    //cout<<endl<<x<<"->"<<y<<endl;
    int res=0;
    if(x==n)
    {
        return 0;
    }
    else
    {
        res= max(dfs(x+1,y,n)+s[x][y],dfs(x+1,y+1,n)+s[x][y]);
    }
    return res;
}
int main()
{
    int n,i,j,result;
   scanf("%d",&n);
   memset(s,-1,sizeof(s));
for(i=0;i<n;i++)
{
    for(j=0;j<=i;j++)
    cin>>s[i][j];
}
result=dfs(0,0,n);
cout<<result<<endl;
}
此题直接用深搜会超时, 贴上代码
但是用“记忆化搜索则会解决这个问题”;继续贴上ac代码
#include <iostream>
#include<cstdio>
#include<cstdlib>
//#include<memory.h>
#include<string.h>
#include<algorithm>
using namespace std;
int s[360][360];
int dp[360][360];
int dfs(int x,int y,int n)
{
    //cout<<endl<<x<<"->"<<y<<endl;
    if(dp[x][y]>=0)
    {
        return dp[x][y];
    }
    int res=0;
    if(x==n)
    {
        return 0;
    }
    else
    {
        dp[x][y]= max(dfs(x+1,y,n)+s[x][y],dfs(x+1,y+1,n)+s[x][y]);
        res=dp[x][y];
    }
    return res;
}
int main()
{
    int n,i,j,result;
   //while(scanf("%d",&n)!=EOF){
   scanf("%d",&n);
   memset(s,-1,sizeof(s));
   memset(dp,-1,sizeof(dp));
for(i=0;i<n;i++)
{
    for(j=0;j<=i;j++)
    cin>>s[i][j];
}
result=dfs(0,0,n);
cout<<result<<endl;//}
}
                    
                
                
            
        
浙公网安备 33010602011771号