東大卒のお金やりくり奮闘記~株、家計、趣味、経済~

東大卒でメーカー勤務の私がセミリタイアするために投資などを頑張っていこうという趣旨で始めたブログです。既婚男性です。株、家計、趣味、経済の話をメインにゆるゆる話します。

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]);




        }
    }

}