poj 3088 DP

来源:互联网 发布:西部数码备案域名购买 编辑:程序博客网 时间:2024/05/18 01:18
import java.util.*;public class Main {    public static void dp(int t,int num){        int[][] array = new int[12][12];        array[1][1] = 1;        array[1][0] = 1;        for(int i=2;i<=11;i++){            for(int j=1;j<=i;j++){                for(int k=1;k<i;k++){                    array[i][j] += array[k][j]*j+array[k][j-1]*j ;                }            }        }        long ans[] = new long[12];        for(int i=1;i<12;i++){            ans[i] = ans[i-1];            for(int j=1;j<=i;j++){                ans[i]+=array[i][j];            }        }        System.out.println(num+1+" "+t+" "+ans[t]);    }        public static void main(String[] args) throws Exception {        Scanner scan = new Scanner(System.in);        int cases = scan.nextInt();        for(int i=0;i<cases;i++){            dp(scan.nextInt(),i);        }    }}


数学公式的方法我就不写了. 这个DP,也不算DP,没有局部最优解这一说, 其实是递推, 总而言之就是没想到。。。


解空间的构造有点难想,array[i][j] 代表了 前i个数中,组成j个组合的种数,J 个组合就是指J个括号,括号里几个数不管。

所以呢如果新数字作为一个新组合加入进去,就是平行地插入前j-1种组合,j-1种组合变成了J种, 前j-1种组合有j 个口可以插进去。arr[k][j-1]*j

新数字插入之前的某个组合去,那么也是随便插入,有J个括号可以给你选择,注意括号里的顺序是无所谓的,题意是指多个按钮同时摁下,

所以其实括号内的顺序不用考虑,马德这里开始没看明白,更加不可能想到DP公式了。。。

最后总数计算还要注意想清楚下,这题比较令人郁闷。。。没想到的都令人郁闷。。但是还算好题吧。

算是不错的DP题,只不过不太好想,智商又低了。。


原创粉丝点击