• Aizu 2302 On or Off dfs/贪心


    On or Off

    Time Limit: 1 Sec  

    Memory Limit: 256 MB

    题目连接

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93265#problem/C

    Description

    Saving electricity is very important!

    You are in the office represented as R imes C grid that consists of walls and rooms. It is guaranteed that, for any pair of rooms in the office, there exists exactly one route between the two rooms. It takes 1 unit of time for you to move to the next room (that is, the grid adjacent to the current room). Rooms are so dark that you need to switch on a light when you enter a room. When you leave the room, you can either leave the light on, or of course you can switch off the light. Each room keeps consuming electric power while the light is on.

    Today you have a lot of tasks across the office. Tasks are given as a list of coordinates, and they need to be done in the specified order. To save electricity, you want to finish all the tasks with the minimal amount of electric power.

    The problem is not so easy though, because you will consume electricity not only when light is on, but also when you switch on/off the light. Luckily, you know the cost of power consumption per unit time and also the cost to switch on/off the light for all the rooms in the office. Besides, you are so smart that you don't need any time to do the tasks themselves. So please figure out the optimal strategy to minimize the amount of electric power consumed.

    After you finished all the tasks, please DO NOT leave the light on at any room. It's obviously wasting!

    Input

    The first line of the input contains three positive integers R (0 lt R leq 50), C (0 lt C leq 50) and M (2 leq M leq 1000). The followingR lines, which contain C characters each, describe the layout of the office. '.' describes a room and '#' describes a wall.

    This is followed by three matrices with R rows, C columns each. Every elements of the matrices are positive integers. The (r, c) element in the first matrix describes the power consumption per unit of time for the room at the coordinate (r, c). The (r, c) element in the second matrix and the third matrix describe the cost to turn on the light and the cost to turn off the light, respectively, in the room at the coordinate (r, c).

    Each of the last M lines contains two positive integers, which describe the coodinates of the room for you to do the task.

    Note that you cannot do the i-th task if any of the j-th task (0 leq j leq i) is left undone.

    Output

    Print one integer that describes the minimal amount of electric power consumed when you finished all the tasks.

    Sample Input

    1 3 2
    ...
    1 1 1
    1 2 1
    1 1 1
    0 0
    0 2

    Sample Output

    7

    HINT

    题意

    给你一个r*c的矩阵,然后再告诉你每一个格子,开灯的花费,关灯的花费,灯每开一秒钟需要的花费

    然后让你按着顺序去完成任务,问你最小花费是多少

    题解:

    首先,题意中,保证从一个任务到另外一个任务只有一条路,所以就是一个树形dp了其实

    对于每个点,你都暴力出,经过这个点的时间,然后处理出来就好了

    然后就贪心搞一搞……

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int maxn = 50 + 3;
    int mat[maxn][maxn],n,m,q;
    int on[maxn][maxn];
    int off[maxn][maxn];
    int t[maxn][maxn];
    int ptr[maxn][maxn];
    vector<int>PPP[maxn][maxn];
    
    char s[maxn][maxn];
    
    struct node
    {
        int x,y;
    };
    node mis[1200];
    vector<node> Q;
    
    vector<node> P;
    
    int Flag=0;
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1};
    int vis[maxn][maxn];
    void dfs(int x,int y,int xx,int yy)
    {
        if(Flag)return;
        if(x==xx&&y==yy)
        {
            int stary = 0;
    
            for(int i=1;i<P.size();i++)
                Q.push_back(P[i]);
            Flag=1;
            return;
        }
        for(int i=0;i<4;i++)
        {
            int xxx = x+dx[i];
            int yyy = y+dy[i];
            if(xxx<=0||xxx>n)continue;
            if(yyy<=0||yyy>m)continue;
            if(vis[xxx][yyy])continue;
            if(s[xxx][yyy]=='#')continue;
            node ttt;ttt.x=xxx;ttt.y=yyy;
            P.push_back(ttt);
            vis[xxx][yyy]=1;
            dfs(xxx,yyy,xx,yy);
            P.pop_back();
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&t[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&on[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&off[i][j]);
    
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&mis[i].x,&mis[i].y);
            mis[i].x++;mis[i].y++;
        }
        Q.push_back(mis[1]);
        for(int i=1;i<q;i++)
        {
            memset(vis,0,sizeof(vis));
            Flag=0;
            P.clear();
            vis[mis[i].x][mis[i].y]=1;
            node k;k.x=mis[i].x,k.y=mis[i].y;
            P.push_back(k);
            dfs(mis[i].x,mis[i].y,mis[i+1].x,mis[i+1].y);
        }
        for(int i = 0 ; i < Q.size() ; ++ i)
        {
            node cur = Q[i];
            int x = cur.x , y = cur.y;
            PPP[x][y].push_back(i);
        }
        int ans = 0;
        for(int i = 1 ; i <= n ; ++ i)
            for(int j = 1 ; j <= m ; ++ j)
             if(PPP[i][j].size() != 0)
        {
            ans += on[i][j]; ans += off[i][j];
            for(int z = 0 ; z < PPP[i][j].size() - 1 ; ++ z)
            {
                int dis = PPP[i][j][z+1] - PPP[i][j][z];
                ans += min(dis * t[i][j] , off[i][j] + on[i][j]);
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    只要7步,就能将任何魔方6面还原
    写一篇文章测试一下
    关于80端口被占用
    打造只能输入数字的文本框
    windows下MySql忘记密码的解决方案
    linq to xml 操作sitemap
    C#设计模式——工厂方法模式(Factory Method Pattern)
    C#设计模式——单件模式(Singleton Pattern)
    C#设计模式——迭代器模式(Iterator Pattern)
    C#设计模式——状态模式(State Pattern)
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4851560.html
Copyright © 2020-2023  润新知