Problem:
A: IPアドレス (Internet Protocol Address)

問題

数字列が 1 つ与えられるので、IPv4のIPアドレスとして有効な区切り方の個数を求めよ。
ただし、IPv4のIPアドレスとして有効な区切り方は以下の通りである。

数字列は 4 つに区切られ、区切られた各列について以下をすべて満たす。

空列でない。

10 進数として読むと 0 以上 255 以下の整数である。

その数が 0 ならば、その列は 0 である（00 などは認められない）。

その数が 0 でないならば、先頭の数字は 0 でない（01 などは認められない）。

入力形式

S

制約

4 \leq |S| \leq 12

S に含まれる文字は数字のみである。

出力形式

有効な区切り方の通り数を一行に出力せよ。

入力例1

123456789

出力例1

1

有効な区切り方は 123.45.67.89 の 1 通りである。

入力例2

768426

出力例2

6

Solution in JAVA (judge verdict: Accepted)

import java.util.*;

public class Main {
    static long[][] dp;
	public static void main (String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		dp = new long[5][s.length() + 1];
		for (int i = 0; i < 5; i++) {
		    Arrays.fill(dp[i], -1L);
		}
		System.out.println(getCount(4, s));
	}
	
	static long getCount(int size, String s) {
	    if (dp[size][s.length()] != -1) {
	        return dp[size][s.length()];
	    }
	    if (size == 1) {
	        long ans = 0;
	        if (s.length() > 3 || s.length() <= 0) {
	        } else if (s.length() > 1 && s.charAt(0) == '0') {
	        } else {
    	        int x = Integer.parseInt(s);
    	        if (x > 255) {
    	            
    	        } else {
	                ans = 1;
    	        }
	        }
	        dp[size][s.length()] = ans;
	        return ans;
	    }
	    long ans = 0;
	    for (int i = 1; i <= 3 && i < s.length(); i++) {
	        if (i > 1 && s.charAt(0) == '0') {
	            break;
	        }
	        if (i == 3 && Integer.parseInt(s.substring(0, 3)) > 255) {
	            break;
	        }
	        ans += getCount(size - 1, s.substring(i, s.length()));
	    }
	    dp[size][s.length()] = ans;
	    return ans;
	}
}