您的位置:首页 > 其它

poj 1163 The Triangle(第一道DP~~~~)

2010-07-23 21:17 316 查看
刚刚才知道。。。DP就是动态规划啊。。。害我以为DP是多高深的东东。。。



一直不理解。。。这道题基本理解了,基本照抄的。。。偶是看着例子理解的。。这个就是第一个例子。。。



郁闷,还是多做做题哈~~~



输出一个三角形从上到下的最大和。。。和树差不多哈~



用递归的话,会重复计算,所以用动态规划啦~将计算的结果保存,避免重复计算~



因为我也刚开始学。。有些地方解释不好。。。见谅啦~以后几天攻DP~~



超时的做法。。。完全递归。。以身试法。。确实TLE。。。



#include <stdio.h>
#include <stdlib.h>
int n;
int tri[102][102];
int maxsum(int x,int y)
{
    int sum1,sum2;
    if( x == n )
        return tri[x][y];
    sum1 = maxsum(x+1,y);
    sum2 = maxsum(x+1,y+1);
    if( sum1 > sum2 )
        return sum1 + tri[x][y];
    else
        return sum2 + tri[x][y];
}
int main(void)
{
    int i,j;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        for(j=1; j<=i; j++)
            scanf("%d",&tri[i][j]);
    printf("%d",maxsum(1,1));
system("pause");
return 0;
}






用函数做的。。。DP



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int max[102][102],tri[102][102];
int n; 
int maxsum(int x,int y)
{
    if( x == n )
        return tri[x][y];
    if(max[x+1][y] == -1)
        max[x+1][y] = maxsum(x+1,y);
    if(max[x+1][y+1] == -1)
        max[x+1][y+1] = maxsum(x+1,y+1);
    if( max[x+1][y] > max[x+1][y+1] )
        return max[x+1][y] + tri[x][y];
    else
        return max[x+1][y+1] + tri[x][y];
}
int main(void)
{
    int n,i,j;
    memset(max,-1,sizeof(max));
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        for(j=1; j<=i; j++)
            scanf("%d",&tri[i][j]);    
    printf("%d",maxsum(1,1));

system("pause");
return 0;
}






这个最好理解了,直接从下往上推~~~~~~



#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int i,j,n;
    int tri[102][102];
    int max[102][102];
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        for(j=1; j<=i; j++)
            scanf("%d",&tri[i][j]);
    for(i=1; i<=n; i++)
        max
[i] = tri
[i];
    for(i=n; i>=1; i--)
        for(j=1; j<i; j++)
        {
            if(max[i][j] > max[i][j+1])
                max[i-1][j] = max[i][j] + tri[i-1][j];
            else
                max[i-1][j] = max[i][j+1] + tri[i-1][j];
        }
    printf("%d",max[1][1]);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: