Super Jumping! Jumping! Jumping! HDU - 1087
2017-07-03 21:37
369 查看
这题错的莫名其妙
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 1000+5
using namespace std;
int a[1005];
int dp[1005];
int main(void)
{
intn;
while((scanf("%d",&n))==1&&n)
{
for(inti=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i]=a[i];
}
for(inti=2;i<=n;i++)
{
intmmax=-99999;
for(intj=1;j<i;j++)
{
if(a[j]<a[i]&& a[j] >= mmax)
{
mmax= a[j];
}
}
//printf("%d-",index);
if(index!=-1)
dp[i]+=dp[index];
//printf("%d-",dp[i]);
}
int mmax=-999999;
for(inti=1;i<=n;i++)
{
if(dp[i]>mmax)
mmax=dp[i];
}
printf("----%d\n",mmax);
}
}
AC了,发现还是思维错了,求的应该是 a[i] < a[i] 中 DP 最大的 ,而不是 a[j] < a[i] 中,,最大的数,, 对应的 DP 。 比如例子 7 1 2 3 4 5 6 8 如果按照上面的会输出 15 ,然而应该是 1+2+3+4+5+6+8 是最大值 。 这题可以简单的说,我只要找出比 a [i] 小的d[j]集合中 , dp最大的那个 。。 必定满足每次都是最大,那么dp[1~n] 每一个都是最优的情况,那么推出 dp
就是最优的情况. 就满足了最优子解的问题。再者考虑
无后效性 , 前面我选择了什么,只能通过当前的状态去影响后面的状态,而不能持续的影响以后的状态, 我通过哪个dp 找到当前的 dp[i] 无所谓(4 3 1 5,DP[4]无论是从4→5还是3→1→5,对于5后面的DP没有任何影响),我只要找到DP最大的,并且小于a[i]的就满足要求就可以。 ````````` 也就这么粗浅的理解了,还需要多做题来理解题目意思`````。动态规划就是说要求 每一个DP 都是 最优,每一个DP都是由前面的最优DP推出来,当前的求得的DP由前面最优的DP求出来,当前的DP也就是最优的,每一个DP是最优的,最终所求的DP
就是最优解了1!!!!!。
这题和最长上升序列几乎一样
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 1000+5
using namespacestd;
int a[10005];
int dp[10005];
int main(void)
{
int n;
while((scanf("%d",&n))==1&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i]=a[i];
}
dp[1]=a[1];
for(int i=2;i<=n;i++)
{
int mmax=0;
int index=-1;
for(int j=1;j<i;j++)
{
if(a[j]<a[i] && dp[j]>= mmax)
{
mmax = dp[j];
index = j;
}
}
//printf("%d-",index);
dp[i]+=mmax;
//printf("%d-",dp[i]);
}
int mmax=-999999;
for(int i=1;i<=n;i++)
{
//printf("%d-",dp[i]);
if(dp[i]>mmax)
mmax=dp[i];
}
printf("%d\n",mmax);
}
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 1000+5
using namespace std;
int a[1005];
int dp[1005];
int main(void)
{
intn;
while((scanf("%d",&n))==1&&n)
{
for(inti=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i]=a[i];
}
for(inti=2;i<=n;i++)
{
intmmax=-99999;
for(intj=1;j<i;j++)
{
if(a[j]<a[i]&& a[j] >= mmax)
{
mmax= a[j];
}
}
//printf("%d-",index);
if(index!=-1)
dp[i]+=dp[index];
//printf("%d-",dp[i]);
}
int mmax=-999999;
for(inti=1;i<=n;i++)
{
if(dp[i]>mmax)
mmax=dp[i];
}
printf("----%d\n",mmax);
}
}
AC了,发现还是思维错了,求的应该是 a[i] < a[i] 中 DP 最大的 ,而不是 a[j] < a[i] 中,,最大的数,, 对应的 DP 。 比如例子 7 1 2 3 4 5 6 8 如果按照上面的会输出 15 ,然而应该是 1+2+3+4+5+6+8 是最大值 。 这题可以简单的说,我只要找出比 a [i] 小的d[j]集合中 , dp最大的那个 。。 必定满足每次都是最大,那么dp[1~n] 每一个都是最优的情况,那么推出 dp
就是最优的情况. 就满足了最优子解的问题。再者考虑
无后效性 , 前面我选择了什么,只能通过当前的状态去影响后面的状态,而不能持续的影响以后的状态, 我通过哪个dp 找到当前的 dp[i] 无所谓(4 3 1 5,DP[4]无论是从4→5还是3→1→5,对于5后面的DP没有任何影响),我只要找到DP最大的,并且小于a[i]的就满足要求就可以。 ````````` 也就这么粗浅的理解了,还需要多做题来理解题目意思`````。动态规划就是说要求 每一个DP 都是 最优,每一个DP都是由前面的最优DP推出来,当前的求得的DP由前面最优的DP求出来,当前的DP也就是最优的,每一个DP是最优的,最终所求的DP
就是最优解了1!!!!!。
这题和最长上升序列几乎一样
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 1000+5
using namespacestd;
int a[10005];
int dp[10005];
int main(void)
{
int n;
while((scanf("%d",&n))==1&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i]=a[i];
}
dp[1]=a[1];
for(int i=2;i<=n;i++)
{
int mmax=0;
int index=-1;
for(int j=1;j<i;j++)
{
if(a[j]<a[i] && dp[j]>= mmax)
{
mmax = dp[j];
index = j;
}
}
//printf("%d-",index);
dp[i]+=mmax;
//printf("%d-",dp[i]);
}
int mmax=-999999;
for(int i=1;i<=n;i++)
{
//printf("%d-",dp[i]);
if(dp[i]>mmax)
mmax=dp[i];
}
printf("%d\n",mmax);
}
}
相关文章推荐
- DP-HDU-1087-Super Jumping!Jumping!Jumping!
- HDU_1087 Super Jumping! Jumping! Jumping!
- HDU 1087 Super Jumping! Jumping! Jumping!
- hdu 1087 Super Jumping! Jumping! Jumping! (动态规划)
- HDU 1087 Super Jumping! Jumping! Jumping!
- HDU 1087 Super Jumping! Jumping! Jumping!(最大上升子序列)
- HDU 1087 Super Jumping! Jumping! Jumping!【DP】
- hdu 1087 Super Jumping! Jumping! Jumping! ( 求序列的最大上升序列 )
- HDU-1087Super Jumping! Jumping! Jumping!
- HDU 1087 Super Jumping! Jumping! Jumping!
- hdu1087 Super Jumping! Jumping! Jumping!
- HDU-1087 Super Jumping! Jumping! Jumping! (线性dp 上升子序列最大和)
- HDU 1087 Super Jumping! Jumping! Jumping!
- hdu 1087 Super Jumping! Jumping! Jumping!
- 【HDU】1087 - Super Jumping! Jumping! Jumping!(dp)
- HDU--1087 Super Jumping! Jumping! Jumping!
- HDU1087 Super Jumping! Jumping! Jumping!(LIS)
- hdu 1087 Super Jumping! Jumping! Jumping!(LIS变形题,求上升子序列的最大和)
- HDU 1087 Super Jumping! Jumping! Jumping!
- HDU 1087 Super Jumping! Jumping! Jumping!