AOJ2182 Eleven Lover
問題リンク Eleven Lover
- 概要
'0'〜'9'の文字からなる文字列Sが与えられる。Sの連続部分文字列で、それが11の倍数で正の数であるものがいくつあるかを答えよ。ただし、0が先頭に続いているものはカウントしないこと。
以下のことが保証されている
S | <= 80000 |
答えは32bit signed integerにおさまる
- 解法
DPです。
ある整数が11の倍数かどうかは、左から1桁ずつ見れば分かります(過去に ここ で説明したことがあります)。
dp[i][j]: 左からi桁目までを考えたとき、MOD 11がjであるものの個数
という表を埋めれば解けます。dp[i][0]の総和が答えとなります。
i桁目の数字をxiとしたとき、dp[i][xi]が1増えると思いますが、0 leadings な数字はカウントしてはいけないので、xi==0のときに限り+1をスキップしないとダメです。
- ソース
import java.util.Arrays; import java.util.Scanner; //Eleven Lover public class AOJ2182 { void run(){ Scanner sc = new Scanner(System.in); for(;;){ char[] s = sc.next().toCharArray(); if(s.length==1&&s[0]=='0')break; int[][] dp = new int[2][11]; int x = 0, res = 0; for(int i=0;i<s.length;i++,x=1-x){ int r = s[i]-'0'; Arrays.fill(dp[x], 0); for(int j=0;j<11;j++){ dp[x][(10*j+r)%11]+=dp[1-x][j]; } if(r!=0)dp[x][r]++; res+=dp[x][0]; } System.out.println(res); } } public static void main(String[] args) { new AOJ2182().run(); } }