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题,只不过不太好想,智商又低了。。
- poj 3088 DP
- poj dp
- 【dp】POJ
- 【dp】POJ
- [DP] POJ
- [DP] POJ
- [DP] POJ
- 【dp】POJ
- POJ 3670 && POJ 3671 (dp)
- 【DP】 POJ 1080
- poj 1163经典DP
- poj 1088 滑雪(DP)
- poj 1770 树形dp
- POJ 1179 Polygon(DP)
- POJ 1221 dp
- POJ 1953 DP
- POJ 2033 DP
- POJ 1179 Polygon DP
- 无法更新数据库 "***ASPNETDB.MDF",因为数据库是只读的”解决
- 链表
- PowerDesigner-1(概念设计模型-CDM)
- stdafx.h与预编译头文件
- c# 使用XmlTextReader拆分大文件
- poj 3088 DP
- 数组与指针的区别
- 请君入翁,远离Java珍爱生命!Java的低成本骗局
- Android 上百实例源码分析以及开源分析
- C#中怎么创建ACCESS数据库文件
- 关于获得对话框中子控件相对该对话框客户区的位置
- char *p = new char; 和 char *p2 = "abcdef"的区别
- V4L2编程小结
- QoS学习笔记 .