zoukankan      html  css  js  c++  java
  • 51nod1293 dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1293

    1293 球与切换器

    题目来源: Codility
    基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
    收藏
    关注
    有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
    普通dp,因为用了两个操蛋的ceil()和floor()函数WA好几发,最后手写的才A,真是的以后不乱不用了。
    转移方程,令f[i][j][S]表示(i,j)上处于S方向的球的个数,则有
    if(e[i][j]==0) f[i][j][right]=f[i][j-1][right],f[i][j][down]=f[i-1][j][down];
    else f[i][j][e[i][j]]=((f[i][j-1][right]+f[i-1][j][down])+1)/2;
    f[i][j][-e[i][j]]=((f[i][j-1][right]+f[i-1][j][down]))/2;
     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 #define LL long long
     5 LL f[1005][1005][3];
     6 int e[1005][1005];
     7 int go(int x){return x>=0?x:2;}
     8 int main()
     9 {
    10     int N,M,i,j,k;
    11     LL K;
    12 
    13     while(scanf("%d%d%lld",&M,&N,&K)==3){
    14       for(i=1;i<=N;++i)
    15         for(j=1;j<=M;++j)
    16         scanf("%d",&e[i][j]);
    17       if(e[1][1]==0){
    18         f[1][1][2]=K;
    19       }
    20       else{
    21       f[1][1][go(e[1][1])]+=(K+1)/2;
    22       f[1][1][go(-e[1][1])]+=K/2;
    23       }
    24       for(i=1;i<=N;++i)
    25         for(j=1;j<=M;++j){
    26         if(i==1&&j==1) continue;
    27         LL tmp=f[i-1][j][2]+f[i][j-1][1];
    28         if(e[i][j]==0){
    29             f[i][j][1]=f[i][j-1][1];
    30             f[i][j][2]=f[i-1][j][2];
    31         }
    32         else{
    33             f[i][j][go(e[i][j])]=(tmp+1)/2;
    34             f[i][j][go(-e[i][j])]=tmp/2;
    35         }
    36       }
    37     printf("%lld
    ",f[N][M][2]);
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    [LeetCode] 273. Integer to English Words 整数转为英文单词
    What happens when you type an URL in the browser and press enter?
    HTTP Status Code
    What's binary search?
    [Http] Difference between POST and GET?
    [LeetCode] 53. Maximum Subarray 最大子数组
    [LeetCode] 621. Task Scheduler 任务调度
    C# web项目添加*.ashx文件后报错处理
    Web项目和Windows应用程序的配置文件
    C#中web项目使用log4net日志
  • 原文地址:https://www.cnblogs.com/zzqc/p/7764150.html
Copyright © 2011-2022 走看看