第十四周周末总结
来源:互联网 发布:证券期货软件开发许可 编辑:程序博客网 时间:2024/06/13 18:53
这几天做了几道题感觉有点把握住感觉了,然而今天晚上c题做了一晚上到现在还没对,先是改了无数遍终于改出来了,然后提交就是不对,感觉思路和代码都对,样例也过,就是过不了,快被气死。。。。今天晚上做出这道题再睡。。
//终于一行行代码检查找到是一个判断中j写成I了,因为一个小小的失误这道并不难的题改了三个小时了。。。偏偏样例还能过,气死,
poj1185
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
第一行包含两个由空格分割开的正整数,分别表示N和M;
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
5 4PHPPPPHHPPPPPHPPPHHP
6
#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>using namespace std;int n,m,mapp[105],s[105],state[105];int dp[105][100][100];int p;char a[105][11];int csh2(int pos){int sss=0;while(pos) { if(pos&1) sss++; pos/=2; }return sss;}bool judge(int x){if(x&(x<<1)) return false;if(x&(x<<2)) return false;return true;}void csh(){memset(dp,0,sizeof(dp));memset(s,0,sizeof(s));int up=1<<m;p=0;for(int i=0;i<up;i++) { if(judge(i)) { state[p]=i; s[p++]=csh2(i); } }for(int i=0;i<p;i++) { if(mapp[0]&state[i]) continue; dp[0][i][0]=s[i]; }for(int i=0;i<p;i++) { if(mapp[1]&state[i]) continue; for(int j=0;j<p;j++) { if(mapp[0]&state[j]) //就是这个j写成了i 一改改了三个小时 orz continue; if(state[i]&state[j]) continue; dp[1][i][j]=max(dp[1][i][j],dp[0][j][0]+s[i]); } }for(int i=2;i<n;i++) { for(int j=0;j<p;j++) { if(mapp[i]&state[j]) continue; for(int k=0;k<p;k++) { if(mapp[i-1]&state[k]) continue; if(state[j]&state[k]) continue; for(int l=0;l<p;l++) { if(mapp[i-2]&state[l]) continue; if((state[l]&state[k])||(state[l]&state[j])) continue; dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+s[j]); } } } }}int main(){while(cin>>n>>m) { for(int i=0;i<n;i++) scanf("%s",a[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(a[i][j]=='H') mapp[i]+=(1<<j); csh(); int ss=0; for(int i=0;i<p;i++) for(int j=0;j<p;j++) if(dp[n-1][i][j]>ss) ss=dp[n-1][i][j]; cout<<ss<<endl; }return 0;}
阅读全文
0 0
- 第十四周周末总结
- 第十一周周末总结+反思
- 第十四周总结
- 第十四周总结
- 第十四周周四总结
- 第十四周一周总结
- 【考研】第十四周总结
- 【考研】第十四周总结
- 2017开学训练第十一周周末总结
- 第十四周 OJ总结<1>--数组逆序
- leetcode第十四周解题总结--二分查找
- 第十四周训练总结(一)
- 第十四周训练总结(二)
- 第十四周
- 第十四周
- 第十四周
- 第十四周
- 第十四周
- 基于高德SDK实现跑步时轨迹渐变功能
- 满足你使用bootstrap-table的基本需求 列表渲染 a标签的bug 添加按钮
- JAVA开发短信验证码系统
- 单链表的倒置
- docker面试你要知道
- 第十四周周末总结
- 算法期中 拓补序
- forward和redirect的区别
- 马的遍历
- Socket笔记和简单实例
- 《逆向的入门》-希望能帮到一些对逆向有兴趣的朋友(如有转载请标注SmallSky写)
- 传球游戏
- 弹出层
- JAVA | 46