hdu2851 (dp)

原创 2015年07月06日 16:17:10
/**
it has N horizontal roads, the ladders always stay at right side vertically, 
开始有n条水平的马路,梯子总垂直的放在右边
and the ladders are extending towards up and down with unlimited length. If ladder near or cross a road, 
而且梯子上下没有限制,如果梯子靠近或穿过一条路
little WisKey will walk on the road by climbed the ladder. Two roads were covered by each other in the X-axis; 
小WisKey将就爬上去,两个道路相互通过x州覆盖
it will be considered can be passing through. Each road has an integer W means the dangerous level. 
就被认为可以通过,每条路有个W危险值。
Little WisKey must start at No.1 road, and he can’t go back, 
小WisKey从第一条路开始,不能往回走。
he always go ahead. WisKey want to go some roads, so he needs to know how minimum sum of dangerous will happen. 
总是往上走。
You can finish the game, yes? 
 
Input
The first integer C represents the number of cases, And C cases followed. 
   
Each test case contains a single integer N roads (1<=N<= 2000) and M destinations (1<=M<=500). 
The next N line contains three integers Si, Ei, Wi, meaning the road build from Si to Ei, and the Wi dangerous level (0 <= Si <= Ei <= 1000, 1 <= Wi <= 1000). 
And the roads sorted by Ei increasing yet. The last M line contains integers mean little WisKey’s destinations. 
 
Output
   
For each questions, output the minimum sum of dangerous. If can’t reach the goal, please print -1.
 
Sample Input
3
10 4
1 4 7
5 6 3
3 7 5
2 9 8
10 13 8
12 14 11
11 15 13
16 18 5
17 19 6
8 20 9
1
2
3
10
5 5
1 4 5
3 6 10
5 8 20
2 9 1
7 10 2
1
2
3
4
5
4 4
1 5 1
2 7 20
2 7 3
7 9 4
1
2
3

Sample Output
7
-1
12
24
5
15
35
6
8
1
21
4

*/

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int Game[1010][1010];
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    int maxY=0;
    for(int i=1;i<=m;i++){

        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(b>maxY) maxY=b;
        Game[0][b]=1;

        for(int j=a;j<=b;j++){
            Game[i][j]=c;
        }
    }

//    for(int i=0;i<=m;i++){
//    for(int j=0;j<=maxY;j++)
//    printf("%d\t",Game[i][j]);
//    printf("\n");
//    }


    for(int i=1;i<=m;i++){
        for(int j=1;j<=maxY;j++){
            if(Game[i][j]!=0){
                Game[i][0]=Game[i][j];
                Game[i][0]+=Game[i-1][0];
            }
        }
    }


     for(int i=0;i<=m;i++){
    for(int j=0;j<=maxY;j++)
    printf("%d\t",Game[i][j]);
    printf("\n");
    }



    return 0;
}

/**
3 7 5
2 9 8
10 13 8
12 14 11
11 15 13
16 18 5
17 19 6
8 20 9
0       0       0       0       1       0       1       1       0       1       0       0       0       1       1       1       0       0       1       1       1
14      7       7       7       7       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
-1      0       0       0       0       3       3       0       0       0       0       0       0       0       0       0       0       0       0       0       0
12      0       0       5       5       5       5       5       0       0       0       0       0       0       0       0       0       0       0       0       0
15      0       8       8       8       8       8       8       8       8       0       0       0       0       0       0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       8       8       8       8       0       0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       11      11      11      0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       13      13      13      13      13      0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       5       5       5       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       6       6       6       0
-1      0       0       0       0       0       0       0       9       9       9       9       9       9       9       9       9       9       9       9       9
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int Game[1010][1010];
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    int maxY=0;
    for(int i=1;i<=m;i++){

        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(b>maxY) maxY=b;
        Game[0][b]=1;

        for(int j=a;j<=b;j++){
            Game[i][j]=c;
        }
        Game[i][0]=-1;
    }




        int i=1;

        for(int j=1;j<=maxY;j++)
        {
            if(Game[i][j] && Game[0][j]){
                int x = Game[i][j];



                while(i<=m){
                    if(Game[i][j]){
                        Game[i][0] = Game[i][j] + x;
                    }
                    i++;
                }



            }
        }

//
//    for(int i=1;i<=m;i++){
//        for(int j=1;j<=maxY;j++){
//
//
//
//            if(Game[i][j]!=0 && Game[i][j]){
//                Game[i][0]=Game[i][j];
//                Game[i][0]+=Game[i-1][0];
//            }
//
//
//        }
//    }


     for(int i=0;i<=m;i++){
    for(int j=0;j<=maxY;j++)
    printf("%d\t",Game[i][j]);
    printf("\n");
    }



    return 0;
}


自己测试的数是对了,还超时!!!!!!!!!!!!!!!!!

/**
0       0       0       0       1       0       1       1       0       1       0       0       0       1       1       1       0       0       1       1       1
07      7       7       7       7       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
-1      0       0       0       0       3       3       0       0       0       0       0       0       0       0       0       0       0       0       0       0
12      0       0       5       5       5       5       5       0       0       0       0       0       0       0       0       0       0       0       0       0
15      0       8       8       8       8       8       8       8       8       0       0       0       0       0       0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       8       8       8       8       0       0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       11      11      11      0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       13      13      13      13      13      0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       5       5       5       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       6       6       6       0
24      0       0       0       0       0       0       0       9       9       9       9       9       9       9       9       9       9       9       9       9

*/

/**
3 7 5
2 9 8
10 13 8
12 14 11
11 15 13
16 18 5
17 19 6
8 20 9
0       0       0       0       1       0       1       1       0       1       0       0       0       1       1       1       0       0       1       1       1
14      7       7       7       7       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
-1      0       0       0       0       3       3       0       0       0       0       0       0       0       0       0       0       0       0       0       0
12      0       0       5       5       5       5       5       0       0       0       0       0       0       0       0       0       0       0       0       0
15      0       8       8       8       8       8       8       8       8       0       0       0       0       0       0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       8       8       8       8       0       0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       11      11      11      0       0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       13      13      13      13      13      0       0       0       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       5       5       5       0       0
-1      0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       6       6       6       0
-1      0       0       0       0       0       0       0       9       9       9       9       9       9       9       9       9       9       9       9       9
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int Game[2010][2010];
 int AAA[2000];
// int BBB[2000];
int main()
{
    int cases=0;
    scanf("%d",&cases);
    while(cases--){
//            memset(Game,0,sizeof(Game));


                int m=0,n=0;
                scanf("%d%d",&m,&n);
                int maxY=0;
                for(int i=1;i<=m;i++){


                    int a,b,c;
                    scanf("%d%d%d",&AAA[i],&b,&c);
                    if(b>maxY) maxY=b;
                    Game[0][b]=1;

                    for(int j=AAA[i];j<=b;j++){
                        Game[i][j]=c;
                    }
                    Game[i][0]=-1;

                }

//            for(int i=0;i<=20;i++) printf("%d  ",AAA[i]);



//                    int nextJ=1;
                    for(int i=1;i<=m;i++){


                            if(Game[i][0]!=-1 || i==1)

                            for(int j=AAA[i];j<=maxY;j++)
                            {
                                if(Game[i][j] && Game[0][j]){

                                    if(i==1)
                                    Game[i][0]=Game[i][j];
                                    int x = Game[i][0];


                                    int k=i;
                                    k++;
                                    while(k<=m){
                                        if(Game[k][j]){
                                            if(Game[k][0] == -1 )
                                            Game[k][0] = Game[k][j] + x;
                                            else if(Game[k][j] + x < Game[k][0])
                                            Game[k][0] = Game[k][j] + x;
                                        }

                                        k++;
                                    }

                                if(Game[i][j+1]==0) break;

                                }
                            }
                    }

            //
            //    for(int i=1;i<=m;i++){
            //        for(int j=1;j<=maxY;j++){
            //
            //
            //
            //            if(Game[i][j]!=0 && Game[i][j]){
            //                Game[i][0]=Game[i][j];
            //                Game[i][0]+=Game[i-1][0];
            //            }
            //
            //
            //        }
            //    }


//            /putput:
//                 for(int i=0;i<=m;i++){
//                for(int j=0;j<=maxY;j++)
//                printf("%d\t",Game[i][j]);
//                printf("\n");
//                }

                while(n--){
                    int aa=0;
                    scanf("%d",&aa);
                    printf("%d\n",Game[aa][0]);
                }


    }


    return 0;
}

今天在好好想想,,,,!!



今晚训练题就要结束,把这题A了,开始想的应该说是想麻烦了,那这题算是从开始看题,到A接近一周了!

这个被众多博客认为的水题,卧槽我他妈这么久搞出来,就算没有很认真的想过但是这样的刷法是不是太慢,,

还是我太多虑了,看题解是刷的快,貌似刷的效果不如这样理解深刻,那还是慢慢来吧,先试试

最近这个学习的时间也是好少。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

然后就是感觉需要看的书还都没看,那就希望学多少要有多少长进


AC:代码

#include<cstdio>
#include<algorithm>
using namespace std;
struct RO
{
    int x,y,z;
}road[2012];
int dp[2012];
int main()
{
    int n;
    scanf("%d",&n);
    while(n--){
        int N,M;
        scanf("%d%d",&N,&M);
        for(int i=0;i<N;i++) dp[i]=-1;
        for(int i=0;i<N;i++)
            scanf("%d%d%d",&road[i].x, &road[i].y, &road[i].z);
        dp[0] = road[0].z;
        for(int i=0;i<N;i++){
            if(dp[i]!= -1)
            for(int j=i+1;j<N;j++){
                if(road[i].y <= road[j].y && road[i].y>=road[j].x){
                    if(dp[j] == -1) dp[j] = dp[i] + road[j].z;
                    else dp[j] = min(dp[i] + road[j].z , dp[j] );
                }

            }
        }
        while(M--){
            int x;
            scanf("%d",&x);
            printf("%d\n",dp[x-1]);
        }

//        for(int i=0;i<N;i++) printf("%d ",dp[i]);

    }
    return 0;
}


版权声明:stay positive,work harder than everybody else

安卓手机屏幕分辨率与dip、dp、sp的区别

以下文章知其然不知所其然,只能先看看,还有,现在的分辨率除了640x480这几种,还有720x1080这些,所有不一定就是 HVGA屏density=160;QVGA屏density=120WVGA屏...
  • cdnight
  • cdnight
  • 2015年06月10日 10:03
  • 5761

状态压缩dp入门 (poj3254 Corn Fields)

题目链接:http://poj.org/problem?id=3254 题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多...
  • y990041769
  • y990041769
  • 2014年04月28日 19:10
  • 18981

AC自动机+DP小结 (一)

好久没有更新博客了,最近真是懒到家了,南京赛前重点复习了下AC自动机+DP方面的题,写下来总结一下。 HDU 2457  DNA repair http://acm.hdu.edu.cn/showpr...
  • dyx404514
  • dyx404514
  • 2013年11月13日 11:12
  • 3398

hdu 2851 Beat It 单调队列+DP

Problem DescriptionThere's a monster-attacking game on the Renren's open platform, and the game's ba...
  • kongming_acm
  • kongming_acm
  • 2011年07月23日 21:16
  • 571

HDU 2851.Lode Runner【DP动态规划】【5月11】

Lode Runner Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To...
  • a995549572
  • a995549572
  • 2016年05月11日 19:18
  • 273

HDU--2851(最短路)

一道简单的最短路。。。 我去题目样例看了好久,原来12345那些目标地是说的哪一个road啊,坑……注意一下这里的权值不是边的是点的,初始化cost的时候不小心写错了,用优化的dij应该会更快一些……...
  • whoISVip
  • whoISVip
  • 2015年06月20日 16:27
  • 559

杭电2851 简单dp

这道题说白了就是一道水题,就是题意不太好理解。题意:给你多个区间,每个区间有一个危险值,接下来有多次询问,求从第一个区间到第n个区间的最小危险值。 就是一道简单的dp,题目: Lode R...
  • wmn_wmn
  • wmn_wmn
  • 2012年02月20日 20:09
  • 712

HDU2851--Lode Runner--最短路

Description Lode Runner is a famous game, I think you played in your childhood. Ok, now, I...
  • a305657
  • a305657
  • 2013年02月03日 11:27
  • 386

【最短路Dijkstra算法】hdu 2851

这题对最短路小小的变形,普通的最短路权值在边上,而这道题权值在点上!所以,代模板也要讲究技巧,具体表现在对dis[x]值的初始化上,具体看代码,最好画图理解透彻! //复杂度O(n^2) #in...
  • leolin_
  • leolin_
  • 2011年08月23日 00:25
  • 486

HDU DP 题集

  • 2013年04月24日 18:31
  • 724KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu2851 (dp)
举报原因:
原因补充:

(最多只允许输入30个字)