codevs 2851 菜菜买气球
dp加二分法
链接:http://codevs.cn/problem/2851/
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<cstdio> 5 #include<cstring> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 10 int a[2010]; 11 int b[2010]; 12 int n,m,k; 13 int f[2101][2010]; 14 15 16 int dp(int x,int y) 17 { 18 if(x==y) return a[x]; 19 if(f[x][y]>0) return f[x][y]; 20 int mid=(x+y)/2; 21 return f[x][y]=dp(x,mid)+dp(mid+1,y); 22 } 23 24 bool IsP(int x) 25 { 26 if(x<=1) return false; 27 for(int i=2;i<=floor(sqrt(x));i++) 28 if(x%i==0) return false; 29 return true; 30 } 31 32 int main() 33 { 34 cin>>n; 35 for (int i=1;i<=n;i++) 36 cin>>a[i]; 37 for (int i=1;i<=n;i++) 38 for (int j=1;j<=n;j++) 39 f[i][j]=-1; 40 int ans=0; 41 int l,r; 42 43 for (int i=1;i<=n;i++) 44 for (int j=i;j<=n;j++) 45 { 46 int p=dp(i,j); 47 if (IsP(p)&&p>ans) 48 { 49 l=i; 50 r=j; 51 ans=p; 52 } 53 } 54 cout<<l<<" "<<r<<" "<<ans; 55 return 0; 56 }