hdu5110 dp

news/2024/12/4 17:35:22/

题意 给 了 一 个 矩 阵 然 后 , 潜 艇 可 以 向 前 在 西北和东北之间 的区域, 然后每个潜艇有一个值D ,当到达潜艇距离为D的倍数的时候可以得到这个价值,这样我们1000*1000 的矩阵,D<=1000, dp这么多显然是不可以的,那么对于大于sqrt(n); 直接暴力, 对于小于sqrt(n) 的进行dp 

dp[i][j][k]=dp[i-k][j-k][k]+dp[i-k][j+k][k]-dp[i-k-k][j][k]+num[i-k][j+k-1]-num[i-k][j-k]

j-k

不存在时 dp[i][j][k]=dp[i-k][j+k][k]+num[i-k][j+k-1]-num[i-k][0]+num[i-k-k][j+k-1]-num[i-k-k][0];

j+k

不存在时 dp[i][j][k]=dp[i-k][j-k][k]+num[i-k][M]-num[i-k][j-k]+num[i-k-k][M]-num[i-k-k][j];

两个都不存在时,我们就定义dp[i][j][k]=dp[i-k][M][k]+num[i-k][M-1]+num[i-k][0]+num[i-k-k][M-K-1]-num[i-k-k][0]

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string.h>
#include <cmath>
using namespace std;
const int maxn= 1005;
int N,M,Q;
int dp[maxn][maxn][32];
char str[maxn][maxn];
int num[maxn][maxn];
int X[maxn*500],Y[maxn*500],D[maxn*500];
int solve(int x, int y, int d){if(d==0){return num[x][y]-num[x][y-1];}int L=y,R=y;int  ans=0;while(x>0){ans+= num[x][R]-num[x][L-1];x -= d;L=max( 1 , L - d );R=min( R + d ,M  );}return ans;
}
int main()
{while(scanf("%d%d%d",&N,&M,&Q)==3){for(int i=1; i<=N; ++i){scanf("%s",str[i]+1);num[i][0]=0;for(int j=1; j<=M; ++j)if(str[i][j]=='X')num[i][j]=num[i][j-1]+1;else num[i][j]=num[i][j-1];}int maxD=0;for(int i=0; i<Q; ++i ){scanf("%d%d%d",&X[i],&Y[i],&D[i]);maxD=max(maxD,D[i]);}maxD=min(double (maxD) ,sqrt(N+0.5) );for(int i=1; i<=N; ++i)for(int j=1; j<=M; ++j)for(int k =1 ; k <= maxD; ++k){dp[i][j][k]=str[i][j]=='X'?1:0;if(i-k>0){if(j-k>0&&j+k<=M){dp[i][j][k]+=dp[i-k][j-k][k]+dp[i-k][j+k][k];dp[i][j][k]+=num[i-k][j+k-1]-num[i-k][j-k];if(i-2*k>0)dp[i][j][k]-=dp[i-2*k][j][k];}else if(j-k>0){dp[i][j][k]+=dp[i-k][j-k][k]+num[i-k][M]-num[i-k][j-k];if(i-k-k>0)dp[i][j][k]+=num[i-k-k][M]-num[i-k-k][j];}else if(j+k<=M){dp[i][j][k]+=dp[i-k][j+k][k]+num[i-k][j+k-1]-num[i-k][0];if(i-k-k>0)dp[i][j][k]+=num[i-k-k][j-1]-num[i-k-k][0];}else{dp[i][j][k]+=dp[i-k][M][k]+num[i-k][M-1]-num[i-k][0];if(M-k>0&&i-k-k>0)dp[i][j][k]+=num[i-k-k][M-k-1]-num[i-k-k][0];}}}for(int i=0; i<Q; ++i){if(D[i]<=maxD)printf("%d\n",dp[X[i]][Y[i]][D[i]]);else printf("%d\n",solve(X[i],Y[i],D[i]));}}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Opaser/p/4127347.html


http://www.ppmy.cn/news/306986.html

相关文章

JoyStick Shield连接Nokia 5110--Arduino

SpaceTrash游戏是一个简单的射击游戏&#xff0c;您可以在其中控制宇宙飞船&#xff0c;并通过移动或爆破&#xff08;使用激光&#xff09;来避免漂浮在周围的小行星的碰撞。该游戏是u8g2图形库附带的示例&#xff0c;该图形库通常用于连接具有SPI或I2C协议的各种单色8位显示器…

P5110 块速递推

传送门 为啥我就没看出来有循环节呢…… 打表可得&#xff0c;这个数列是有循环节的&#xff0c;循环节为\(10^96\)&#xff0c;然后分块预处理&#xff0c;即取\(ksqrt(10^96)\)&#xff0c;然后分别预处理出转移矩阵\(A\)的\(A^1,A^2,...,A^{k-1}\)和\(A^k,A^{2k},...\)&…

STM32驱动Nokia5110

//以下是lcd5110.c #include "lcd5110.h" #include "english_6x8_pixel.h" //中文字库自己添加&#xff0c;如果没有请注释起来#include "write_chinese_string_pixel.h" //lcdgpio初始化函数 //GPIOC.0.9.10.11.12推挽输出&#xff0c;G…

linux驱动安装完桌面分辨率,kunbutu15.04安装后调整分辨率

在vbox里边安装了Kubuntu15.04虚拟机&#xff0c;安装过程还算顺利但是由于分辨率的问题&#xff0c;无法显示完全&#xff0c;折腾了我好一会&#xff0c;网上的说法可能只是应用于个人情况&#xff0c;所以我也记录下我的情况&#xff01; 我的本子是戴尔n5110 15寸的屏幕&am…

DELL笔记本安装windows10与deepin双系统详细图文教程

首先&#xff0c;我们的电脑上应该安装好了一个windows操作系统&#xff0c;我的系统是win10 1809版本。 工具&#xff1a; 1、装有win10系统的DELL电脑一台 2、4g以上的u盘一个 第一步 下载iso镜像 从deepin官网下载iso镜像&#xff0c;建议从百度云下&#xff0c;比较方…

arduino uno + nokia 5110

现在外面风雨交加&#xff0c;中午一盒隆江猪脚饭都没吃完的我饿得已经看不动QT的文档了&#xff0c;于是翻出实验室昨天入货的nokia5110玩下&#xff0c;显示个求救信号。 看图&#xff1a;NOKIA 5110 亲爱的arduino就不要爆照了 下面上过程&#xff0c;对于懒人来说&#xf…

如何用STM32驱动诺基亚5110显示屏?

关注星标公众号&#xff0c;不错过精彩内容 转自 | 嵌入式从0到1 早期诺基亚5110显示屏用51单片机驱动的比较多&#xff0c;今天分享一下用STM32驱动诺基亚5110显示屏的方法。 NOKIA 5110 屏 Nokia5110屏是一个非常经典的液晶显示模块&#xff0c;在作者玩单片机的时候&#xf…

洛谷P5110 块速递推 题解

洛谷P5110 块速递推 题解 题目链接&#xff1a;P5110 块速递推 题意&#xff1a;给定一个数列 a a a 满足递推式 a 0 0 , a 1 1 a n 233 a n − 1 666 a n − 2 a_00,a_11 \\a_n 233a_{n-1}666a_{n-2} a0​0,a1​1an​233an−1​666an−2​ 求 a n m o d ( 1 0 9 7 )…