洛谷P1050 数的划分
代码:
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
private static int[][] direct={{0,1},{1,0},{-1,0},{0,-1}};
private static AWriter writer = new AWriter(System.out);
private static AReader reader = new AReader(System.in);
private static long n;
private static double INFINITY=Double.POSITIVE_INFINITY;
private static int dp[][];
public static void main(String[] args) throws IOException {
int n=reader.nextInt();
int k=reader.nextInt();
dp=new int[n+1][k+1];
for (int i=1;i<=n;i++) {dp[i][1]=1;dp[i][0]=1;}
for (int x=2;x<=k;x++) {dp[1][x]=0;dp[0][x]=0;}
for(int i=2;i<=n;i++)
for(int j=2;j<=k;j++) {
if (i>j) dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
else dp[i][j]=dp[i-1][j-1];
}
writer.println(dp[n][k]);
writer.close();
reader.close();
}
}
class AReader implements Closeable {
private BufferedReader reader;
private StringTokenizer tokenizer;
public AReader(InputStream inputStream) {
reader = new BufferedReader(new InputStreamReader(inputStream));
tokenizer = new StringTokenizer("");
}
private String innerNextLine() {
try {
return reader.readLine();
} catch (IOException ex) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String nextLine = innerNextLine();
if (nextLine == null) {
return false;
}
tokenizer = new StringTokenizer(nextLine);
}
return true;
}
public String nextLine() {
tokenizer = new StringTokenizer("");
return innerNextLine();
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.valueOf(next());
}
public long nextLong() {
return Long.valueOf(next());
}
public double nextDouble() {
return Double.valueOf(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
@Override
public void close() throws IOException {
reader.close();
}
}
// Fast writer for ACM By Azure99
class AWriter implements Closeable {
private BufferedWriter writer;
public AWriter(OutputStream outputStream) {
writer = new BufferedWriter(new OutputStreamWriter(outputStream));
}
public void print(Object object) throws IOException {
writer.write(object.toString());
}
public void println(Object object) throws IOException {
writer.write(object.toString());
writer.write("\n");
}
@Override
public void close() throws IOException {
writer.close();
}
}
思路
卡了一天没办法看了题解,感觉对dp的理解稍微多了点
我们可以把这道题描述为 在盒子中放置球
对于划分类数,可以分作两种情况
1.对于所有盒子中包含只有一个球的盒子
2.对于所有盒子中不包含只有一个球的盒子
这两种情况相反,可以构成我们的状态转移方程
对于第一种情况可以转移为
k-1个盒子包含n-1个球
对于第二种情况可以转移为
x-k球放入n个盒子内
列出状态转移方程
d
p
[
n
]
[
k
]
=
d
p
[
n
−
1
]
[
k
−
1
]
+
d
p
[
n
−
k
]
[
k
]
dp[n][k]=dp[n-1][k-1]+dp[n-k][k]
dp[n][k]=dp[n−1][k−1]+dp[n−k][k]