zoukankan      html  css  js  c++  java
  • 三部曲二(基本算法、动态规划、搜索)-1017-炮兵阵地

    炮兵阵地

    Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
    Total Submission(s) : 26   Accepted Submission(s) : 8
    Problem Description
    司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 

    如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 
    现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 
     
    Input
    第一行包含两个由空格分割开的正整数,分别表示N和M; 
    接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
     
    Output
    仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
     
    Sample Input
    5 4
    PHPP
    PPHH
    PPPP
    PHPP
    PHHP 
    Sample Output
    6
     
    Source
    PKU
     
    不得不说dp真是博大精深啊,这道题非常经典。
     
      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <cstring>
      4 #include <string>
      5 
      6 using namespace std;
      7 
      8 int state[1025],num[102],n,m,cnt;
      9 int mp[102],dp[102][66][66];
     10 
     11 void DFS(int now,int tmp,int tnum)
     12 {
     13     if(now==m)
     14     {
     15         num[cnt]=tnum;
     16         state[cnt++]=tmp;
     17 //        cout<<tmp<<endl;
     18         return;
     19     }
     20     int i;
     21     for(i=0;i<=1;i++)
     22     {
     23         if(i==0||(i==1&&tmp%4==0))
     24         {
     25             tmp=tmp*2+i;
     26             if(i==1)
     27                 tnum++;
     28             DFS(now+1,tmp,tnum);
     29             if(i==1)
     30                 tnum--;
     31             tmp=(tmp-i)/2;
     32         }
     33     }
     34     tmp=tmp/2;
     35     return;
     36 }
     37 
     38 int main()
     39 {
     40 //    freopen("in.txt","r",stdin);
     41     int i,j,k,l;
     42     scanf("%d%d",&n,&m);
     43     cnt=0;
     44     char str[11];
     45     memset(dp,-1,sizeof(dp));
     46     memset(mp,0,sizeof(mp));
     47     memset(num,0,sizeof(num));
     48     for(i=0;i<n;i++)
     49     {
     50         scanf("%s",str);
     51         for(j=0;j<m;j++)
     52         {
     53             if(str[j]=='H')
     54                 mp[i]=mp[i]*2+1;
     55             else if(str[j]=='P')
     56                 mp[i]=mp[i]*2+0;
     57         }
     58     }
     59     DFS(0,0,0);
     60 //    for(i=0;i<cnt;i++)
     61 //        printf("%d %d
     ",state[i],num[i]);
     62     for(i=0;i<cnt;i++)
     63     {
     64         if(!(mp[0]&state[i]))
     65             dp[0][0][i]=num[i];
     66     }
     67     for(i=0;i<cnt;i++)
     68     {
     69         if(!(mp[1]&state[i]))
     70         {
     71             for(j=0;j<cnt;j++)
     72             {
     73                 if(dp[0][0][j]>=0&&!(state[i]&state[j]))
     74                 {
     75                     dp[1][j][i]=dp[0][0][j]+num[i];
     76                 }
     77             }
     78         }
     79     }
     80     for(i=2;i<n;i++)
     81     {
     82         for(j=0;j<cnt;j++)
     83         {
     84             for(k=0;k<cnt;k++)
     85             {
     86                 if(dp[i-1][j][k]>=0)
     87                 {
     88                     for(l=0;l<cnt;l++)
     89                     {
     90                         if(!(mp[i]&state[l])&&!(state[l]&state[j])&&!(state[l]&state[k]))
     91                             dp[i][k][l]=max(dp[i][k][l],dp[i-1][j][k]+num[l]);
     92                     }
     93                 }
     94             }
     95         }
     96     }
     97     int ans=0;
     98     for(i=0;i<cnt;i++)
     99     {
    100         for(j=0;j<cnt;j++)
    101             ans=max(ans,dp[n-1][i][j]);
    102     }
    103     printf("%d
    ",ans);
    104     return 0;
    105 }
     
  • 相关阅读:
    C语言基础---字符指针变量和字符数组的区别
    C语言基础---编写C语言代码过程中易忽略的点
    C语言简介---通过指针引用多维数组
    C语言基础---特殊的变量类型(结构体、枚举、共用体)
    C语言基础---指针简述
    C语言基础---C语言中的变量与内存空间的关系
    嵌入式开发中常用到的C语言库函数
    SVN使用---简介
    视频编解码相关基础知识(二)---H.264简介
    MybatisPlus MetaObjectHandler 配置
  • 原文地址:https://www.cnblogs.com/aljxy/p/3458203.html
Copyright © 2011-2022 走看看