■0070 Combination of Number Sequences
探索?TLE
高速化したよー
TLE
~長い年月~
やっぱDPじゃんテキトーに組む
TLE
ま・さ・か
実は探索?
nとsの範囲が実は狭いことに気付く(n≦10,s≦330).大きい場合は絶対に存在しない.
ばっち枝刈りしたZE
TLE
あるぇー(・3・)
nとsが小さいんだから,予めDPで生成しておけるよねー.
前に書いたDPを流用
AC
- import java.util.*;
- import java.lang.*;
- import java.math.*;
- import java.io.*;
- import static java.lang.Math.*;
- import static java.util.Arrays.*;
- public class Main{
- Scanner sc=new Scanner(System.in);
- static final int INF=1<<28;
- static final double EPS=1e-9;
- int n, s;
- int[][] sum;
- void run(){
- n=10;
- s=330;
- init();
- for(; sc.hasNext();){
- n=sc.nextInt();
- s=sc.nextInt();
- if(n<=10&&s<=330){
- println(sum[n-1][s]+"");
- }else{
- println("0");
- }
- }
- sc.close();
- }
- void init(){
- int[][] dp=new int[s+1][1<<10];
- int[][] dp2=new int[s+1][1<<10];
- sum=new int[n][s+1];
- dp[0][0]=1;
- for(int j=0; j<n; j++){
- for(int i=0; i<=s; i++){
- System.arraycopy(dp[i], 0, dp2[i], 0, 1<<10);
- Arrays.fill(dp[i], 0);
- }
- for(int i=0; i<10; i++){
- int d=(j+1)*i;
- for(int b=0; b<1<<10; b++){
- if(((1<<i)&b)==0){
- for(int k=0; k+d<=s; k++){
- dp[k+d][(1<<i)|b]+=dp2[k][b];
- }
- }
- }
- }
- for(int i=0; i<=s; i++){
- for(int b=0; b<1<<10; b++){
- sum[j][i]+=dp[i][b];
- }
- }
- }
- }
- void debug(Object... os){
- System.err.println(Arrays.deepToString(os));
- }
- void print(String s){
- System.out.print(s);
- }
- void println(String s){
- System.out.println(s);
- }
- public static void main(String[] args){
- new Main().run();
- }
- }
0 件のコメント:
コメントを投稿