競プロをしながら、節約と株式投資でセミリタイアを目指す東大卒のブログ

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。火木土日に更新予定です。お金について考えています。

ABC183で書いたコード

using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string args)
        {
            //問題クラスを展開
            ProgramE a = new ProgramE();
            a.main();//実行する

        }

    }
    //ABC183
    class ProgramA
    {
        public void main()
        {
            //入力
            int s = int.Parse(Console.ReadLine());

            //sが0未満かどうかで場合分け
            if (s < 0)
                Console.WriteLine(0);
            else
                Console.WriteLine(s);

        }
    }

    class ProgramB
    {
        public void main()
        {
            //入力
            string a = Console.ReadLine().Split();
            double sx = double.Parse(a[0]);
            double sy = double.Parse(a[1]);
            double gx = double.Parse(a[2]);
            double gy = double.Parse(a[3]);


            //答を出力
            Console.WriteLine(sx - (sx - gx) * sy / (sy + gy));



        }
    }

    class ProgramC
    {
        static long[,] c;
        static long z;
        static long k;
        static long count = 0;
        public void main()
        {

            //入力
            string s = Console.ReadLine().Split();
            int n = int.Parse(s[0]);
            k = long.Parse(s[1]);
            c = new long[nn];
            z = new long[n];

            //それぞれの経路距離を記録
            for (int i = 0i < ni++)
            {
                string a = Console.ReadLine().Split();
                for (int j = 0j < nj++)
                    c[ij] = long.Parse(a[j]);

            }
            //深さ優先検索
            dfs("a"n - 1);
            Console.WriteLine(count);

        }

        static void dfs(string tint n)
        {
            if (n == t.Length - 1)
            {
                long sum = 0;
                int flag = 0;
                for (int i = 0i < ni++)
                {
                    int y = 0;
                    for (int j = 0j < t.Lengthj++)
                    {
                        if (t[j] == (char)(i + 98)) //98は'b'
                            y++;
                    }
                    if (y > 1)
                        flag = 1;
                }

                if (flag == 0)
                {
                    t += 'a';
                    for (int i = 0i <= ni++)
                    {
                        sum += c[t[i] - 'a't[i + 1] - 'a'];
                    }
                    if (sum == k)
                        count++;
                }

            }
            else
            {
                for (char c = 'b'c < 'b' + nc++)
                    dfs(t + cn);
            }
        }

    }


    class ProgramD
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine().Split();
            int n = int.Parse(s[0]);
            long w = long.Parse(s[1]);

            long c = new long[200001];

            for (int i = 0i < ni++)
            {
                string a = Console.ReadLine().Split();
                c[int.Parse(a[0])] += long.Parse(a[2]);
                c[int.Parse(a[1])] -= long.Parse(a[2]);
            }

            //累積和で記録
            for (int i = 1i < ni++)
                c[i] += c[i - 1];

            //累積和で判断
            for (int i = 0i < ni++)
            {
                if (c[i] > w)
                {
                    Console.WriteLine("No");
                    return;
                }
            }

            //答
            Console.WriteLine("Yes");

        }


    }

    class ProgramE
    {
        public void main()
        {
            //入力
            string[] s = Console.ReadLine().Split(' ');
            long H = long.Parse(s[0]);
            long W = long.Parse(s[1]);
            long mod = 1000000000 + 7;

            long[,] maze = new long[HW];
            long[,] dp = new long[HW];
            long[,] x = new long[HW];
            long[,] y = new long[HW];
            long[,] z = new long[HW];
            

            //ブロックを入れておく
            for (int i = 0i < Hi++)
            {
                string t = Console.ReadLine();
                for (int j = 0j < Wj++)
                {
                    if (t[j] == '#')
                    {
                        maze[ij] = -1;
                    }
                }

            }

            //最初は一通り
            dp[00] = 1;

           
            //たてよこななめでそれぞれ累積和
            for (int i = 0i < Hi++)
                for (int j = 0j < Wj++)
                {
                    if (i == 0 && j == 0)
                        continue;
                    if (maze[ij] == -1)
                        continue;

                    if(j > 0)
                        x[ij] = (x[ij - 1] + dp[ij - 1]) % mod;
                    if (i > 0)
                        y[ij] = (y[i - 1j] + dp[i - 1j]) % mod;
                    if (i > 0 && j > 0)
                        z[ij] = (z[i - 1j - 1] + dp[i - 1j - 1]) % mod;
                    //全経路を累積する
                    dp[ij] = (x[ij] + y[ij] + z[ij]) % mod;

                }



            //答え出力
            Console.WriteLine(dp[H - 1W - 1]);




        }
    }

}