
DP
skillart
It is me.
展开
-
hdu 1171
真心无语了。wa了无数次,终于才发现原来是数组开的太小了,浪费多少时间啊。。。。。。 这是一个多重背包问题,但那个dp式子实在不好理解的,直接转化成0,1背包了,然后就很easy了。 import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(原创 2013-04-03 21:48:36 · 765 阅读 · 0 评论 -
hdu 1160
下次做题的时候不能中途干其他的了,写着写着忘记之前写的是什么意思了,白白浪费很长时间。 对重量进行升序排序,如果重量相等则也按速度降序排序。 之后就是LIs了。 用一个二维数组dp[len][2],dp[][0]用来记录递增序列的长度,dp[][1]用来记录维持此长度的前一个坐标。 逆序打印出来就是了。 看网上其他的用的数据结构真不好想的。膜拜下。 import java.util.A原创 2013-03-30 23:17:41 · 1003 阅读 · 0 评论 -
hdu 1176
动态转移方程:dp[i][j=max{dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]}; 其中dp[i][j]表示的是在第i秒j位置上能接到的最多馅饼数目。 在i=1时,j除4,5,6位置以外都不能接到馅饼,所以计算先从i=2开始。先对i=1时进行初始化。 接到最多馅饼必然是在i最大的时候。 进行动态规划时应先按时间进行划分,,先算出一个时间所有位置的状态,而不是原创 2013-04-07 13:33:09 · 713 阅读 · 0 评论 -
hdu1159
LCS。 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); while(cin.hasNext()) {原创 2013-03-30 17:08:38 · 1091 阅读 · 0 评论 -
hdu 1158
很经典的动态规划。 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt(); while原创 2013-03-28 23:15:00 · 888 阅读 · 0 评论 -
hdu 1087
求最大递增序列和。状态转移方程:a[i]=max{dp[j]+a[i],dp[i]} 0 import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new S原创 2013-03-28 20:39:41 · 1042 阅读 · 0 评论 -
hdu1081
把多维压缩到一维,再dp求最大子段。 import java.util.Arrays; import java.util.Scanner; public class Main { public static int max_sum(int dp[]) { int max=Integer.MIN_VALUE,sum=0; for(int i=1;i<dp.lengt原创 2013-03-26 10:57:47 · 819 阅读 · 0 评论 -
hdu1069
高有3种,长比 宽长,于是每种矩形可以产生3种类型。 对矩形长款降序排序,就转换为最长递减序列问题了。可以用dp O(n^2),也可以用dp+二分查找,就是二分查找是在不好写啊。数据比较少,直接dp吧。 import java.util.Arrays; import java.util.Scanner; class rectangle implements Comparable原创 2013-03-24 16:51:21 · 949 阅读 · 0 评论 -
hdu 1024最大m子段和
转移方程为fi][j]=max(f[i-1][j],max(f[k][j-1]))+a[j](j-1 比如这么一行数据 3 6 2 3 -7 6 4 -5 所得到的f[i][j]数据如图所示 0 1 2 3 0 0 0 0 0 1 0 2 0 0 2 0 5 5 0 3 0 -2 -2 -2原创 2013-03-15 14:01:43 · 1204 阅读 · 1 评论 -
hdu 1003 最大子段和
第二个if和第一个顺序不能颠倒,应为sum置0了(可能max0,得到的结果就错了),其实多设置一个temp变量就可以颠倒位置了 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in);原创 2013-03-14 20:35:04 · 994 阅读 · 0 评论 -
nyoj37 回文字符串
把字符串反转,然后用反串和原串求最大公共子序列(LCS),再用字符串长度减去LCS的长度就是答案。 写的有点废,不过方便以后直接调用。 import java.util.Scanner; public class Main { static int lcs(String str1,String str2) { int len1=str1.length(); in原创 2013-06-06 21:49:58 · 1024 阅读 · 0 评论