您的位置:首页 > 其它

hdu4699 Editor(双向链表或双栈对弹)

2015-10-28 19:17 309 查看
本题就是两个要点:

1.数据结构的设计。显然可以使用双向链表来做,但是写双向链表的代码复杂度高。其实更好的方法是使用两个对弹的栈来做,而且没必要用STL的栈,就自己开两个数组简单搞一下就好了。

2.最大前缀和的更新。很简单的递推关系,dp[i]=max(dp[i-1],sum[i]),意思是从开头到a[i]的最大前缀和里,要么没有i(即dp[i-1]),要么有i(即sum[i])。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<list>
#include<deque>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const double eps=1e-10;
const int INF=1000000000;
const int maxn=1000000+10;

int n,x;
char op[3];
int l[maxn],r[maxn],sum[maxn],dp[maxn];

int main()
{
//freopen("in2.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)==1)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
dp[0]=-INF;//这个一定要有
int t1=0,t2=0;
while(n--)
{
scanf("%s",op);
if(op[0]=='I')
{
scanf("%d",&x);
l[++t1]=x;
sum[t1]=sum[t1-1]+x;
dp[t1]=max(sum[t1],dp[t1-1]);
}
else if(op[0]=='L')
{
if(t1==0) continue;
r[++t2]=l[t1--];
}
else if(op[0]=='R')
{
if(t2==0) continue;
l[++t1]=r[t2--];
sum[t1]=sum[t1-1]+l[t1];
dp[t1]=max(sum[t1],dp[t1-1]);
}
else if(op[0]=='D')
{
if(t1==0) continue;
t1--;
}
else if(op[0]=='Q')
{
scanf("%d",&x);
printf("%d\n",dp[x]);
}
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: