Ejercicios de aprendizaje de programación dinámica (1)

Aprendizaje general

De hecho, muchas personas piensan en problemas de algoritmos basados ​​en una especie de solución violenta. Intentan enumerar. Si la enumeración es exitosa, el problema puede completarse. Sin embargo, si la enumeración falla, se perderá. El sistema de prueba le dice que el tiempo de ejecución del problema excede Cuando el alcance es limitado, todavía está bastante calvo.
De hecho, antes se usaba la programación dinámica para resolver problemas, pero descubrí que este algoritmo es análogo a las palabras en inglés, si no lo usas durante mucho tiempo, lo olvidarás. Cuando quise volver a probar la solución de programación dinámica, descubrí que, aparte de recordar las cuatro palabras del problema de la mochila , tenía la cabeza en blanco, así que fui al blog del Gran Dios para aprender sobre el problema de la mochila de la programación dinámica. Cada vez que termino de aprender este algoritmo clásico, puedo darme una nueva sensación, así que decidí ir a la zona de Likou para cepillar algunas preguntas más y practicarlas.

474. Uno y cero (Li Kou)

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

 

示例 1:

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5031 的最大子集是 {
    
    "10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {
    
    "0001","1"}{
    
    "10","1","0"}{
    
    "111001"} 不满足题意,因为它含 41 ,大于 n 的值 3 。
示例 2:

输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {
    
    "0", "1"} ,所以答案是 2 。
 

提示:

1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] 仅由 '0''1' 组成
1 <= m, n <= 100

Con mucho entusiasmo, quiero probar las rutinas algorítmicas que entiendo para intentar resolverlo, pero esta pregunta realmente me dio un tiro en la cabeza. Lo que nos enseña el problema de la mochila es cómo usar la variable del volumen de la mochila para limitar las opciones. El mayor valor, esta pregunta dio dos restricciones, emmmm ... Piense con cuidado, de hecho, todavía hay puntos en común entre los problemas. Aunque el problema de la mochila tiene solo un factor limitante en la superficie, aún agregó otro al considerarlo dinámicamente. Restricciones en la cantidad de elementos que se pueden seleccionar . Aunque esta pregunta tiene dos restricciones, dado que cada cadena solo se puede usar una vez (es decir, una mochila limitada), al actualizar dp (i, j), i y j son ambos necesarios para enumerar de mayor a menor. En cuanto a por qué debe entenderse así, equivale a la elección inversa del problema de la mochila. Usamos dp (i, j) para representar el número máximo de cadenas que se pueden deletrear usando i 0s yj 1s, entonces la ecuación de transición de estado es:

dp[i][j] = Math.max(1+dp[i-arr[0]][j-arr[1]], dp[i][j]);

Donde k representa la k-ésima cadena, arr [0] y arr [1] representan el número de 0 y 1 en la cadena


    public static int findMaxForm(String[] strs, int m, int n) {
    
    
    	int[][] dp = new int[m+1][n+1];
    	for(int k = 0;k < strs.length;k++) {
    
    
    		int[] arr = intcount(strs[k]);
        	for(int i = m;i >= arr[0];i--) {
    
    
        		for(int j = n;j >= arr[1];j--) {
    
    
        			dp[i][j] = Math.max(1+dp[i-arr[0]][j-arr[1]], dp[i][j]);
        		}
        	}
    	}
    	for(int i = 0;i <= m;i++) {
    
    
    		for(int j = 0;j <= n;j++) {
    
    
    			System.out.print(dp[i][j]+" ");
    		}
    		System.out.println();
    	}
    	return 0;
    }
    public static int[] intcount(String str) {
    
    
    	int[] arr = new int[2];
    	for(int i = 0;i < str.length();i++) {
    
    
    		if(str.charAt(i) == '0')
    			arr[0]++;
    		if(str.charAt(i) == '1')
    			arr[1]++;
    	}
    	return arr;
    }

Supongo que te gusta

Origin blog.csdn.net/baldicoot_/article/details/115188158
Recomendado
Clasificación