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 }

 

posted @ 2016-07-19 11:38  pter  阅读(122)  评论(0编辑  收藏  举报