动态规划之工作方案

 

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。

posted @ 2019-07-26 10:10  路在脚下丶  阅读(357)  评论(0编辑  收藏  举报