zoukankan      html  css  js  c++  java
  • BZOJ 3357: [Usaco2004]等差数列(dp)

    传送门

    解题思路

      感觉自己设的状态非常(SB)。设(f[i][j])表示(i,j)作为这个等差数列的末尾时的最大值,那么(f[i][j]=f[k][i]+1(a[i]-a[j]=a[k]-a[i]))。发现这样是(O(n^3))的,发现这样做有用状态很少,可以拿个(map)记录一下第(i)个数差为(j)时的(f)最大值,这样就可以(O(n^2logn))了。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    
    using namespace std;
    const int N=2005;
    
    inline int rd(){
    	int x=0,f=1; char ch=getchar();
    	while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
    	while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    	return f?x:-x;	
    }
    
    int n,a[N],f[N][N],ans;
    map<int,int> mp[N];
    
    int main(){
    	n=rd(); int c;
    	for(int i=1;i<=n;i++) a[i]=rd();
    	for(int i=1;i<=n;i++)
    		for(int j=i+1;j<=n;j++){
    			c=a[j]-a[i];
    			if(mp[i].find(c)==mp[i].end()) f[i][j]=1;
    			else f[i][j]=mp[i][c]+1;
    			if(mp[j].find(c)==mp[j].end()) mp[j][c]=f[i][j];
    			else mp[j][c]=max(mp[j][c],f[i][j]);
    		}
    	for(int i=1;i<=n;i++)
    		for(int j=i+1;j<=n;j++) ans=max(ans,f[i][j]);
    	printf("%d
    ",ans+1);
    	return 0;	
    }
    
  • 相关阅读:
    php 删除指定文件夹
    php 批量进行复制文件
    php 导入/导出 csv 文件
    Java8 Nashorn JavaScript引擎
    Java8 Optional类
    Java8数据流
    Java8默认方法
    异常的其他问题
    package和import语句_5
    继承和权限控制_1
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10363017.html
Copyright © 2011-2022 走看看