NOJ 1837 美女购物(DP,DAG图)

来源:互联网 发布:软件编程在哪里学 编辑:程序博客网 时间:2024/04/29 09:26
难得的dp水题。
题目:一天,GG陪佳佳逛街,看到有许多漂亮的衣服,佳佳要让GG给她买衣服,但是GG发现衣服的价格实在高的令人胆寒,GG当然不愿意买这么贵的衣服,但是他又想让佳佳高兴.因此GG就想着从街头逛到街尾买到的衣服价格不能比前一件购买的价格高,绝不回头购买,而且他想尽可能的多买几件衣服,你能帮帮他吗?。。
数据:
16
 300 250 275 252 200 138 245 130 300 128 244 243 242 241 240 239

10(300 275 252 245 244 243 242 241 240 239)(购买顺序)

思路:每个数据看做一个顶点,后面输入一个数据只要小于前面的数据,就个看做一个从较大的数到较小的数的有向边,最后求最大即使求有向图中所能走的最大边的长度。

#include <stdio.h>#include <string.h>int d[1010],G[1010][1010],p[1010];      //d[]数组存放输入的数据与之对应的编号,将数据转化为编号存入邻接矩阵中                                        //G[][] 邻接矩阵存放有向图的信息。值为1,表示i到j有有向边存在。int cnt;                               //p[]数组存放从i点出发所能走的最大距离。int main(){    int judge(int x);    int dp(int i);    int n,key,k,max;    while(scanf("%d",&n) != EOF)    {        memset(d,0,sizeof(d));          //所有数组均是用全局变量存储,注意数组的初始化。        memset(G,0,sizeof(G));        memset(p,0,sizeof(p));        cnt = 0,max = 0;        for(int i = 0; i < n ; i ++ )        {            scanf("%d",&key);            k = judge(key);                  //用judge函数来将数据转换存进G数组中,(邻接矩阵存储)            for(int i = 0 ; i < cnt ; i++)            {                if(key < d[i])                {                    G[i][k] = 1;                }            }        }        for(int i = 0 ; i < cnt ; i++) //dp函数计算从每个顶点出发所能走的最远距离。        {            if(max < dp(i))            {                max = dp(i);            }        }        printf("%d\n",max);  //max存放所能走的最远距离。    }    return 0;}int judge(int x){    bool flag = false;    for(int i = 0 ; i <cnt ; i++)    {        if( x == d[i])        {            flag = true;            return i;        }    }    if(!flag)    {        d[cnt] = x;        return cnt++;    }}int dp(int i)                               //递归计算p[]值{    int ans = p[i];    if(ans > 0 ) return ans;    ans = 1;    for(int j = 0 ; j < cnt ; j++)    {        if(G[i][j])        {            if(dp(j)+1 > ans)            {                ans = dp(j) + 1;            }        }    }    p[i] = ans;    return ans;}

原创粉丝点击