NC17395. [NOI2005]瑰丽华尔兹
描述
输入描述
输入的第一行包含5个数N, M, x, y和K。1≤N, M≤200,K≤200,T≤40000.
N和M描述舞厅的大小,x和y为在第1时刻初钢琴的位置(x行y列);我们对船体倾斜情况是按时间的区间来描述的,比如“在[1, 3]时间里向东倾斜,[4, 5]时间里向北倾斜”,因此这里的K表示区间的数目。
以下N行,每行M个字符,描述舞厅里的家具。第i行第j列的字符若为‘ . ‘,则表示该位置是空地;若为‘ x ‘,则表示有家具。
以下K行,顺序描述K个时间区间,格式为:si ti di(1 ≤ i ≤ K)。表示在时间区间[si, ti]内,船体都是向di方向倾斜的。di为1, 2, 3, 4中的一个,依次表示北、南、西、东(分别对应矩阵中的上、下、左、右)。输入保证区间是连续的,即
s1 = 1
ti = si-1 + 1 (1 < i ≤ K)
tK = T
输出描述
输出仅有1行,包含一个整数,表示钢琴滑行的最长距离(即格子数)。
示例1
输入:
4 5 4 1 3 ..xx. ..... ...x. ..... 1 3 4 4 5 1 6 7 3
输出:
6
说明:
C++(clang++ 11.0.1) 解法, 执行用时: 609ms, 内存消耗: 100780K, 提交时间: 2022-10-07 18:31:00
#include<bits/stdc++.h> #define qq 234 using namespace std; long long n,m,k,s[qq],t[qq],d[qq],f[qq][qq][qq]; long long dx[]={0,-1,1,0,0}, dy[]={0,0,0,-1,1}; char a[qq][qq]; int dfs(int sum,int x,int y){ if (sum> k) return 0; int ans = f[sum][x][y]; if (ans != -1) return ans; ans = dfs(sum + 1, x, y); int xx = x, yy = y; for (int i = 1; i <= t[sum] - s[sum] + 1; i++) { xx += dx[d[sum]], yy += dy[d[sum]]; if (a[xx][yy] == 'x' || xx > n || xx<1 || yy>m || yy < 1) break; ans = max(ans, i + dfs(sum + 1, xx, yy)); } return f[sum][x][y] = ans; } int main(){ memset(f,-1,sizeof(f)); ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); long long x,y; cin>>n>>m>>x>>y>>k; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j]; for(int i=1;i<=k;i++)cin>>s[i]>>t[i]>>d[i]; cout<<dfs(1,x,y); }