bzoj 3357: [Usaco2004]等差数列
2017-02-15 11:21
246 查看
f[i][j]表示i接j后面的最长长度,枚举中间的那个数用个hash表转移就行了。
水题。
水题。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define N 2005 using namespace std; int n; int a[2*N]; int f[2*N][2*N]; int head[5000005],ver[N*2],nxt[N*2],pos[N*2],tot; int st[2*N],top; void add(int x,int y) { int aa=x%5000001; st[++top]=aa; tot++;nxt[tot]=head[aa];head[aa]=tot;ver[tot]=x;pos[tot]=y; } int now; bool find(int x,int y) { int aa=x%5000001; for(int i=head[aa];i;i=nxt[i]) { if(ver[i]==x) { pos[i]=y; return 1; } }return 0; } int find(int x) { int aa=x%5000001; for(int i=head[aa];i;i=nxt[i]) { if(ver[i]==x) { return pos[i]; } }return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int ans=2; if(n==1) { puts("1"); return 0; } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { f[i][j]=2; } } for(int i=2;i<=n;i++) { for(int j=1;j<i;j++) { ans=max(ans,f[j][i]); if(!find(a[j],j)) { //cout<<i<<' '<<a[j]<<' '<<j<<endl; add(a[j],j); } } for(int j=i+1;j<=n;j++) { int tmp=find(a[i]*2-a[j]); if(tmp) { // cout<<i<<' '<<j<<endl; f[i][j]=max(f[i][j],f[tmp][i]+1); } } tot=0; for(int j=1;j<=top;j++) { head[st[j]]=0; } top=0; } printf("%d\n",ans); return 0; }
相关文章推荐
- bzoj 3357: [Usaco2004]等差数列(DP+map)
- bzoj3357 [Usaco2004]等差数列 dp+map
- bzoj 3357: [Usaco2004]等差数列
- BZOJ 3357: [Usaco2004]等差数列( dp )
- bzoj 3357: [Usaco2004]等差数列 动态规划
- BZOJ 3357 Usaco2004 等差数列 动态规划
- BZOJ 3357: [Usaco2004]等差数列
- 【bzoj3357】[Usaco2004]等差数列
- bzoj 3357: [Usaco2004]等差数列
- 3357: [Usaco2004]等差数列 DP+map
- 3357: [Usaco2004]等差数列|DP
- 3357: [Usaco2004]等差数列
- bzoj 3361: [Usaco2004 Jan]培根距离
- bzoj3389: [Usaco2004 Dec]Cleaning Shifts安排值班
- bzoj3357 [Usaco2004]等差数列
- bzoj 3385: [Usaco2004 Nov]Lake Counting 数池塘(DFS)
- bzoj 3384: [Usaco2004 Nov]Apple Catching 接苹果
- bzoj 3361: [Usaco2004 Jan]培根距离
- Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一
- [BZOJ3378] [Usaco2004 Open]MooFest 狂欢节(树状数组)