package test;import java.util.Scanner;public class Main0 { public static void main(String[] args) { // TODO Auto-generated method stub final int mod = 1000000007; try(Scanner in = new Scanner(System.in)){ int s = in.nextInt(); int a = in.nextInt(); int b = in.nextInt(); int c = in.nextInt(); int cnt[][][][] = new int[51][51][51][51]; cnt[0][0][0][0] = 1; for(int i = 1;i <= s; i++) { for(int j = 0;j <= i; j++) { for(int k = 0; k <= i; k++) { for(int l = 0; l <= i; l++) { if(j != 0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j-1][k][l] % mod) % mod; if(k != 0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j][k-1][l] % mod) % mod; if(l != 0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j][k][l-1] % mod) % mod; if(j!=0 && k!=0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j-1][k-1][l] % mod) % mod; if(j!=0 && l!=0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j-1][k][l-1] % mod) % mod; if(k!=0 && l!=0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j][k-1][l-1] % mod) % mod; if(j!=0 && k!=0 && l!=0) cnt[i][j][k][l] = (cnt[i][j][k][l] % mod + cnt[i-1][j-1][k-1][l-1] % mod) % mod; } } } } System.out.println(cnt[s][a][b][c]); } }}
本题来自牛客网,网易一道算法题。
参考一位大神的C++算法,改成Java写的。主要思想是动态规划。分析最优子结构可知,当工作量 s+1 时,这个1的工作量必须由后面的3个人做。那么就有2^3 -1 种可能(可以一个人做,可以两个人,可以三个人同时做),所以就有了这么多if语句,当然,不能一个人都不做,所以总共就是2^3 - 1。if判断当中,多个变量时候,任何一个都不能为0,原因是为0相当于没有分给他,这种情况会在之前的if中讨论。最重要的是分析出子结构。然后再dp。