随笔分类 -  动态规划

摘要:要求求出一串数列中不重合的两段子序列的和的最大值思路:正着求一遍最大子串和,记录在lmax数组中,再倒着求一遍最大子串和,记录在rmax中,这时求出的是包含a[i]的最大和lmax[i],rmax[i],还要将lmax,rmax更新成其区间内的最大和,并不一定包括i,最后求出lmax[i] + rmax[i + 1]的最大值#include <stdio.h>int lmax[50000],rmax[50000],max;int main(){ int cas,n,a[50000],i,j; scanf("%d",&cas); while( cas-- 阅读全文
posted @ 2011-04-20 22:50 L.. 阅读(174) 评论(0) 推荐(0)
摘要:#include"stdio.h"int b[1000];int f[1000];int main(){ //freopen("in.txt","r",stdin); int n,i,j,temp;//temp 存最大的f[i] while(scanf("%d",&n),n){ for(i = 0; i < n; i++){ scanf("%d",&b[i]); f[0] = b[0];//第一个数 temp = -1; for(j = 0; j < i; j++){ 阅读全文
posted @ 2011-04-10 06:24 L.. 阅读(115) 评论(0) 推荐(0)
摘要:/*转化为数塔问题dp[i][j] i 表示第i秒 j表示第j个位置 能够拿到的最大馅饼数状态转移方程dp[i][j] = max{dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]} + a[i][j]; 时刻注意边界*/#include <stdio.h>#include <string.h>const int MAX = 100001; int dp[MAX][11]; //1 ~ 100000秒int max2(int d1,int d2){ return d1 > d2 ? d1 : d2;}int max3(int d1,int 阅读全文
posted @ 2011-04-09 02:59 L.. 阅读(233) 评论(0) 推荐(0)
摘要:/*经典的动态规划*/#include <iostream>using namespace std;char str1[1000];char str2[1000];int dp[1001][1001];int main(){ while(cin >> str1 >> str2){ int len1 = strlen(str1); int len2 = strlen(str2); int max = -1; memset(dp,0,sizeof(dp)); for(int i = 0; i < len1; i++){ for(int j = 0; j & 阅读全文
posted @ 2011-04-09 02:22 L.. 阅读(161) 评论(0) 推荐(0)
摘要:/*若N个数 为递增序列则最多需要N个导弹系统贪心 + DP 见注释*/#include <stdio.h>#define MAX 100000int height[MAX]; //height[i]表示第i个防导弹系统所能防御的最大高度int t; //t个数int high; //height[i]中 最高高度 的 下标int a[MAX];int main(){ int i,j; //j 导弹系统个数 while(scanf("%d",&t)!= EOF){ scanf("%d",&a[0]); height[0] = 阅读全文
posted @ 2011-04-09 02:17 L.. 阅读(354) 评论(0) 推荐(0)
摘要:/*给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20 状态转移方程 dp[i] = max(dp[i - 1] + a[i],a[i]) 最长公共子序列 求出最长的起点 和 终点*/#include <stdio.h>int main(){ int i,start,end,ma 阅读全文
posted @ 2011-04-09 02:09 L.. 阅读(348) 评论(0) 推荐(0)