2013年7月31日

hdu 1058

摘要: 1 ->?1 ->2=min(1*2,1*3,1*5,1*7)1 ->2 ->3=min(2*2,1*3,1*5,1*7)1 ->2 ->3 -> 4 = min(2*2,2*3,1*5,1*7)1 ->2 ->3 -> 4 ->5= min(3*2,2*3,1*5,1*7)状态转移方程F(n)=min(F(i)*2,F(j)*3,F(k)*5,F(m)*7)(n>i,j,k,m)特别的:i,j,k,m 只有在本项被选中后才移动#include#include#includeusing namespace std;cons 阅读全文

posted @ 2013-07-31 20:11 blieveboy 阅读(64) 评论(0) 推荐(0) 编辑

hdu 1025 最大上升子序列

摘要: 最大上升子序列 二分参考解释http://blog.sina.com.cn/s/blog_7d3ee9f501012q83.html#includeconst int N = 500005;int num[N], ans[N];int main(){ int n,k=1; int len,low,up,mid; int i, temp1,temp2; while(~scanf("%d", &n)) { for( i = 0 ; i >1; if(ans[mid] len)len ++; } ... 阅读全文

posted @ 2013-07-31 16:14 blieveboy 阅读(55) 评论(0) 推荐(0) 编辑

hdu 1024

摘要: d[i][j]表示前i个分成j段的含a[i]的最大值。1,2,-3.中a[3][1]=0。因为a[3][1]必须包括a[3].这样表示后,d[i][m]就表示前i个分成m段的含a[i]的最大值。那么只要从i=1到i=n,求d[i][m]的最大值,就是前n个分成m段的最大值。比如说:样例1,41,2,-2,4d[1][1]=1,d[2][1]=3,d[3][1]=1,d[4][1]=5.max=5,故输出5.然后就是求状态方程了。状态dp[i][j]有前j个数,组成i组的和的最大值。决策: 第j个数,是在第包含在第i组里面,还是自己独立成组。方程 dp[i][j]=Max(dp[i][j-1]+ 阅读全文

posted @ 2013-07-31 15:30 blieveboy 阅读(71) 评论(0) 推荐(0) 编辑

滚动数组

摘要: 在DP中使用"滚动数组"举个简单的例子:int d[]=new int[100];d[0]=1;d[1]=1;for(int i=2;i<100;i++)d[i]=d[i-1]+d[i-2];System.out.printf("%d",d[99]);上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2];为了节约空间用滚动数组的方法int d[]=new int[3];d[0]=1;d[1]=1;for(int i=2;i<100;i++)d[i%3]=d[(i-1)%3]+d[(i-2)%3];System.out.prin 阅读全文

posted @ 2013-07-31 14:31 blieveboy 阅读(126) 评论(0) 推荐(0) 编辑

导航