hdu 1231最长子序列和
2015-04-17 22:32
204 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1231
。。。。以前一直以为有点理解动态规划,没想到比自己想想的还要弱逼伤自尊。
不过总算写出来了。
这道题首先注意,最后要求输出的是,最大和,最大和所对应的最左元素和最右元素而不是最左序号和最右序号。
既然还要输出最左、右元素只要往右动归一次往左动归一次就好了,不过必须在往左动归之前把数据重新清0.
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N;
int a[10050];
int ans=-1;
int ansk1=0;
int ansk2=N-1;
int dp[10050];
int main()
{
while(scanf("%d",&N)&&N)
{
int i;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
int j,t,k;
dp[0]=a[0];
for(j=1;j<N;j++)
{
int flag=0;
dp[j]=max(dp[j-1]+a[j],a[j]);
if(ans<dp[j])
{
ans=dp[j];
ansk1=j;
}
}
ans=0;
dp[N-1]=a[N-1];
for(j=N-2;j>=0;j--)
{
dp[j]=max(dp[j+1]+a[j],a[j]);
if(ans<dp[j])
{
ans=dp[j];
ansk2=j;
}
}
printf("%d %d %d\n",ans,a[ansk1],a[ansk2]);
}
return 0;
}
思考: dp[j]=max(dp[j-1]+a[j],a[j]);为什么可以?以及,为什么第二个是a[j]?
动归过程中始终保持最优子结构,所以dp[j-1]必然最优,那么想要继续最优下去,要么是把下一个元素加上去,要么抛弃当前的最优(因为前子序列的最优未必是父序列的最优的一部分),重新开一个,(也即子是父的一部分,是或否,选择或不选择)。那么问题来了,有没有可能子的一部分是父的最优的一部分?反对,如果a[j]被选择,说明子不如父优,而又选择子的一部分,说明子的整体不如子的一部分优,矛盾。总之,牢牢记住最优子结构。
。。。。以前一直以为有点理解动态规划,没想到比自己想想的还要弱逼伤自尊。
不过总算写出来了。
这道题首先注意,最后要求输出的是,最大和,最大和所对应的最左元素和最右元素而不是最左序号和最右序号。
既然还要输出最左、右元素只要往右动归一次往左动归一次就好了,不过必须在往左动归之前把数据重新清0.
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N;
int a[10050];
int ans=-1;
int ansk1=0;
int ansk2=N-1;
int dp[10050];
int main()
{
while(scanf("%d",&N)&&N)
{
int i;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
int j,t,k;
dp[0]=a[0];
for(j=1;j<N;j++)
{
int flag=0;
dp[j]=max(dp[j-1]+a[j],a[j]);
if(ans<dp[j])
{
ans=dp[j];
ansk1=j;
}
}
ans=0;
dp[N-1]=a[N-1];
for(j=N-2;j>=0;j--)
{
dp[j]=max(dp[j+1]+a[j],a[j]);
if(ans<dp[j])
{
ans=dp[j];
ansk2=j;
}
}
printf("%d %d %d\n",ans,a[ansk1],a[ansk2]);
}
return 0;
}
思考: dp[j]=max(dp[j-1]+a[j],a[j]);为什么可以?以及,为什么第二个是a[j]?
动归过程中始终保持最优子结构,所以dp[j-1]必然最优,那么想要继续最优下去,要么是把下一个元素加上去,要么抛弃当前的最优(因为前子序列的最优未必是父序列的最优的一部分),重新开一个,(也即子是父的一部分,是或否,选择或不选择)。那么问题来了,有没有可能子的一部分是父的最优的一部分?反对,如果a[j]被选择,说明子不如父优,而又选择子的一部分,说明子的整体不如子的一部分优,矛盾。总之,牢牢记住最优子结构。
相关文章推荐
- hdu--1231--最长子序列(DP)
- --hdu 1231 最大连续子序列(动态规划)
- 最大连续子序列和 HDU 1231 (时间复杂度为O(n))
- hdu 1231 最大连续子序列
- [HDU 1231 最大连续子序列]
- HDU 1231 最大连续子序列
- HDU 1231 最大连续子序列 (线性dp)
- hdu 1231 最大连续子序列(水题)
- HDU-1231-最大连续子序列
- hdu 1003 求最长子序列的和
- hdu 1231最大连续子序列 动态规划
- HDU 1231——最大连续子序列(DP)
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
- HDU 1160 FatMouse's Speed (dp, 最长子序列)
- hdu 1231 最大连续子序列 【最大连续子串】
- HDU ~ 1231 ~ 最大连续子序列(DP)
- HDU 1231 最大连续子序列 --- 入门DP
- hdu 1231最大连续子序列 (动态规划)
- hdu--1231 最长连续子序列(浙大版)
- HDU 1231 最大连续子序列