(new) hdoj 1003(dp)(很经典的题目)
2013-04-28 11:41
429 查看
#include<iostream> #include<stdio.h> using namespace std; #define MAX 100005 //#define MAX 15 int N; int num[MAX]; int maxx=0; int besti; int bestj; void dp() { int i,j; for(i=0;i<N;i++) { int sum=0; for(j=i;j<N;j++) { sum+=num[j]; if(sum>maxx) { maxx=sum; besti=i; bestj=j; } } } } int main() { //freopen("in.txt","r",stdin); int T;int time=0; scanf("%d",&T); for(time=1;time<=T;time++) { //初始化 scanf("%d",&N); int i;maxx=0;besti=0;bestj=0; for(i=0;i<N;i++) { scanf("%d",&num[i]); } dp(); printf("Case %d:\n",time); printf("%d %d %d\n",maxx,besti+1,bestj+1); if(time!=T) printf("\n"); } return 0; }
这个是书上的代码。
时间复杂度是n^2
后来我认真研读,才发现,原来这个是最初的,没有经过化简的
并不是动态规划,这是暴力求解
b[j]=max(a[j],b[j-1]+a[j]);
从上到下理解
从最后一个开始求解,
当加入最后一个数字的时候,如果前面加到j的结果是>0的时候,把么表示可以加上。
从底向上求解
后来我发现还是过不了,然后发现,他所说的子串,至少要有一个元素
#include<iostream> #include<stdio.h> using namespace std; #define MAX 100009 //#define MAX 20 int T; int times; int N; int num[MAX]; int b[MAX]; int maxx; int besti; int bestj; void dp() { int i; int start=0; if(num[0]>=-1001) { b[0]=num[0]; besti=0; bestj=0; start=0; maxx=b[0]; } else b[0]=0; for(i=1;i<N;i++) { int temp=0; //如果这个点比较大,那么从这里打断 if(num[i]>b[i-1]+num[i]) { start=i; temp=num[i]; b[i]=temp; } //如果加上这个点以后,值变大了 else { temp=num[i]+b[i-1]; b[i]=temp; } if(temp>maxx) { maxx=temp; bestj=i; besti=start; } } } int main() { //freopen("in.txt","r",stdin); scanf("%d",&T); for(times=1;times<=T;times++) { //初始化 scanf("%d",&N); memset(b,0,sizeof(b)); int i,j;besti=-1;bestj=-1;maxx=0; maxx=-1001; for(i=0;i<N;i++) { scanf("%d",&num[i]); } dp(); printf("Case %d:\n",times); printf("%d %d %d\n",maxx,besti+1,bestj+1); if(times!=T) printf("\n"); } return 0; }
再后来递交还是不过
后来发现,#define的//没有去掉
相关文章推荐
- HDOJ 1003 经典DP--求最大字串和
- HDU/HDOJ 2602 Bone Collector(DP,0/1背包,贪心,经典题目)
- HDOJ 1420 Prepared for New Acmer(DP)
- HDOJ 5586-Sum【经典DP】
- NYOJ 题目16 矩形嵌套 dp(经典dp,简单,记忆化搜索)
- 各类经典dp问题分讲(HDU 2084、HDU 1003、HDU 1176)
- DP(一)HDOJ 1003 Max Sum(java版)
- HDOJ 题目4405 Aeroplane chess(概率dp求期望)
- HDOJ 题目1561 The more, The Better(树状dp)
- 经典Dp题目
- HDOJ 4283 You Are the One(经典区间dp)
- HDOJ 1420 Prepared for New Acmer(DP)
- HDOJ 题目3853 LOOPS(概率DP)
- acm DP经典题目 滑雪问题 【DP 记忆化搜索 递归】
- 动态规划入门(二)DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050
- HDU - 1003 - Max Sum && POJ - 1050 - To the Max (经典DP问题)
- HDOJ1003(DP)
- 动态规划入门(二)DP 基本思想 具体实现 经典题目 POJ1088
- HDU 1003 Max Sum (经典dp入门题)
- HDOJ 题目2227 Find the nondecreasing subsequences(树状数组,离散化,DP)