【51nod 球与切换器】+ dp
来源:互联网 发布:在淘宝网怎么投诉卖家 编辑:程序博客网 时间:2024/05/16 03:12
球与切换器
李陶冶 (命题人)
基准时间限制:1 秒 空间限制:131072 KB 分值: 80
有N行M列的正方形盒子。每个盒子有三种状态0, -1, +1。球从盒子上边或左边进入盒子,从下边或右边离开盒子。规则:
如果盒子的模式是-1,则进入它的球从下面出去。(方向变为向下)
如果盒子的模式是+1,则进入它的球从右面出去。 (反向变为向右)
如果盒子的模式是0, 则进入它的球方向不变。从上面进入的,从下面出去,从左面进入的,从右面出去。
球离开一个盒子,这个盒子的模式切换为相反数。已知,每个盒子的状态,扔k个球,它们都从左上角那个盒子的上面进入(方向向下),问最终有几个球从右下角的盒子的下边出去。
(可以理解维球一个一个放,等待的时间足够长,不会有两个球同时进入一个盒子的情形)本题由Javaman翻译。
Input
第1行:包括3个数M, N, K中间用空格分隔,M,N 为盒子的宽度和高度,K为球的数量(1 <= M, N <= 1000, 1 <= K <= 10^18)。
第2 - N + 1行:每行M个数(-1, 0 或 1),表示对应的模式。
Output
输出1个数,对应最终有有多少个球从右下角的盒子的下边出去。
Input示例
3 2 4
-1 0 -1
1 0 0
Output示例
1
思路 : 1)如果该位置为 0 通过它的球全部方向不变
2) 如果该位置为 -1 或 1 者通过它的球会有一半的方向为下,一半的方向为右 ,然后 dp 下
AC代码:
#include<stdio.h>const int MAX = 1e3 + 10;typedef long long LL;LL dp[MAX][MAX][2],k; // dp[i][i][0] ,dp[i][i][1] 分别表示从下面和右面出去int main(){ int m,n,x; scanf("%d %d %lld",&m,&n,&k); dp[0][1][0] = k; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ scanf("%d",&x); LL ans = dp[i - 1][j][0] + dp[i][j - 1][1]; if(x == 1) dp[i][j][1] = (ans + 1) / 2,dp[i][j][0] = ans / 2; else if(x == -1) dp[i][j][0] = (ans + 1) / 2,dp[i][j][1] = ans / 2; else dp[i][j][0] = dp[i - 1][j][0],dp[i][j][1] = dp[i][j - 1][1]; } } printf("%lld\n",dp[n][m][0]); return 0;}
阅读全文
0 0
- 【51nod 球与切换器】+ dp
- [DP] 51Nod 1293 球与切换器
- 51nod 1293:球与切换器
- 51Nod-1293-球与切换器
- 51nod 1293 球与切换器
- 51Nod-球与切换器-1293
- 1293 球与切换器(dp)
- 51nod 排列与交换 序列dp
- 51nod 1407 与与与与 dp+容斥
- 51nod 1371 DP
- 51NOD 1296-dp
- 51nod (dp)
- 51nod 1050【DP】
- 51nod 1268【dp】
- 51Nod - 1043 dp
- 51Nod - 1270 dp
- 51Nod - 1406 dp
- 51Nod - 1376 dp
- (2)直接插入排序
- C#实现验证码编写
- android值制作简易的闹钟和通知栏信息
- 函数式编程扫盲篇
- HDU 2159 二维完全背包
- 【51nod 球与切换器】+ dp
- 《黑客与画家》读书笔记
- Error creating bean with name 'itemController': Injection of resource dependencies failed; nested ex
- I
- 写 SQL 时常犯的 10 个错误
- JS中getElementById()、getElementsByName()、getElementsByTagName() 的区别和应用
- Til the Cows Come Home POJ
- 七月英语——安生
- NYOJ 236-心急的C小加(贪心,水题)