■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 件のコメント:
コメントを投稿