acm 数塔

来源:互联网 发布:2017中美人工智能创投 编辑:程序博客网 时间:2024/06/05 19:17

dp,动态规划,一开始都不知道这是什么题目,尴尬,但是能做就行了
从最低端的小三角形开始考虑,最底层相邻两个数看作是与上面的数联合成一条小路,选择大的那个数,这样就可以淘汰一条小路线。每次都能淘汰剩下一半的路线,那一直做下去就可以找出最大的那条路线

#include<iostream>using namespace std;int max(int x,int y){    if(x>y)        return x;    else        return y;}int main(){    int m,n;    int a[101][101];    int sum[101][101]={0};    scanf("%d",&m);    while(m--){        scanf("%d",&n);        for(int i=0;i<n;i++)            for(int j=0;j<i+1;j++)                cin>>a[i][j];            for(int j=0;j<n;j++)                sum[n-1][j]=a[n-1][j];        for(int i=n-1;i>1;i--){            for(int j=0;j<i;j++){                int x=sum[i][j];                int y=sum[i][j+1];                sum[i-1][j]=a[i-1][j]+max(x,y);            }        }        printf("%d\n",a[0][0]+max(sum[1][0],sum[1][1]));    }    return 0;}
原创粉丝点击