• 洛谷 1373 小a和uim之大逃离


    /*
    很容易想到f[i][j][k][l][01] 表示到ij点 两个人得分为kl 01表示这一步谁走的
    因为起点不同 路径不同 所以要枚举起点.. 
    时间复杂度 O(nmk*nmk)
    空间复杂度 O(2*nmkk) 
    超时爆空间.....
    40分 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 810
    #define mod 1000000007
    using namespace std;
    int n,m,K,ans,a[maxn][maxn];
    int f[210][210][17][17][2];
    void Clear(int x,int y)
    {
        for(int i=x;i<=n;i++)
          for(int j=y;j<=m;j++)
            for(int k=0;k<=K;k++)
              for(int l=0;l<=K;l++)
                {
                  f[i][j][k][l][0]=0;
                  f[i][j][k][l][1]=0;
                }
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&K);K++;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
        for(int x=1;x<=n;x++)
          for(int y=1;y<=m;y++)
            {
              Clear(x,y);
              f[x][y][a[x][y]%K][0][0]=1;
              for(int i=x;i<=n;i++)
                for(int j=y;j<=m;j++)
                  for(int k=0;k<K;k++)
                    for(int l=0;l<K;l++)
                      {
                          if(i+1<=n)
                          {
                              f[i+1][j][(k+a[i+1][j])%K][l][0]=(f[i+1][j][(k+a[i+1][j])%K][l][0]+f[i][j][k][l][1])%mod;
                              f[i+1][j][k][(l+a[i+1][j])%K][1]=(f[i+1][j][k][(l+a[i+1][j])%K][1]+f[i][j][k][l][0])%mod;
                          }
                        if(j+1<=m)
                          {
                              f[i][j+1][(k+a[i][j+1])%K][l][0]=(f[i][j+1][(k+a[i][j+1])%K][l][0]+f[i][j][k][l][1])%mod;
                              f[i][j+1][k][(l+a[i][j+1])%K][1]=(f[i][j+1][k][(l+a[i][j+1])%K][1]+f[i][j][k][l][0])%mod;
                          }
                        if(k==l)ans=(ans+f[i][j][k][l][1])%mod;
                      }
            }
        printf("%d
    ",ans);
        return 0;
    }
    /*
    其实刚才的状态可以降一维 把kl改为两个人的差值
    但是会出现负数 考试的时候想到数组平移 但是答案就不对了....
    然后打了暴力 6层循环 美美的~ 后来终于在眼泪中明白 数组平移个卵... 
    因为在Mod的意义下 平移之后状态就不对应了
    不平移mod完之后在+K不就好了嘛 
    还有就是傻傻的枚举起点了..赋好初值 从1 1开始就好了吗
    反正最后统计方案数 互相之间不影响 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 810
    #define mod 1000000007
    using namespace std;
    int n,m,K,ans,a[maxn][maxn];
    int f[maxn][maxn][16][2];
    int main()
    {
        scanf("%d%d%d",&n,&m,&K);K++;
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            {
              scanf("%d",&a[i][j]);
              f[i][j][a[i][j]%K][0]=1;
            }
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            for(int k=0;k<K;k++)
              {
                if(i+1<=n)
                  {
                    f[i+1][j][(k+a[i+1][j])%K][0]=(f[i+1][j][(k+a[i+1][j])%K][0]+f[i][j][k][1])%mod;
                    f[i+1][j][(k-a[i+1][j]+K)%K][1]=(f[i+1][j][(k-a[i+1][j]+K)%K][1]+f[i][j][k][0])%mod;
                  }
                if(j+1<=m)
                  {
                    f[i][j+1][(k+a[i][j+1])%K][0]=(f[i][j+1][(k+a[i][j+1])%K][0]+f[i][j][k][1])%mod;
                    f[i][j+1][(k-a[i][j+1]+K)%K][1]=(f[i][j+1][(k-a[i][j+1]+K)%K][1]+f[i][j][k][0])%mod;
                  }
                if(k==0)ans=(ans+f[i][j][k][1])%mod;
              }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    javascript中事件
    pku 1836 Alignment
    pku 3086 Triangular Sums
    [转]asp格式化日期
    用数组作checkboxlist数据源
    (转)Membership、MembershipUser和Roles类 详解
    asp中判断 checkbox 是否选中
    使用 AddRange 方法将多个 ListItem 对象添加到集合
    My97DatePicker,一个兼容所有浏览器的日历选择脚本(相当经典)
    .Net下批量删除数据的存储过程问题(用动态SQL )
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5813077.html
Copyright © 2020-2023  润新知