标签:poj include div determine cos lin string over cond
Input
Output
Sample Input
7 2 2 1 1 2 2 1 1
Sample Output
6
Hint
设计状态dp[i][j]代表到I时间转换了j次的最大收益,那么状态显然可以由之前的状态转还是不转转移过来,注意加上一段区间的值可以用前缀和来优化。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #include<stack> 9 #include<queue> 10 #include<map> 11 #define RG register 12 #define IL inline 13 #define pi acos(-1.0) 14 #define ll long long 15 using namespace std; 16 int tree1[1005],tree2[1005]; 17 int dp[1005][35]; 18 int T,W; 19 int main() { 20 scanf("%d%d",&T,&W); 21 for(int i=1;i<=T;i++){ 22 int type; 23 scanf("%d",&type); 24 if(type==1) tree1[i]=1; 25 else tree2[i]=1; 26 tree1[i]+=tree1[i-1]; 27 tree2[i]+=tree2[i-1]; 28 } 29 for(int i=1;i<=T;i++) 30 for(int j=0;j<i;j++){ 31 for(int w=0;w<=W;w++){ 32 if(w%2==0){ 33 dp[i][w]=max(dp[i][w],dp[j][w]+tree1[i]-tree1[j]); 34 if(w+1<=W) dp[i][w+1]=max(dp[i][w+1],dp[j][w]+tree2[i]-tree2[j]); 35 } else{ 36 dp[i][w]=max(dp[i][w],dp[j][w]+tree2[i]-tree2[j]); 37 if(w+1<=W) dp[i][w+1]=max(dp[i][w+1],dp[j][w]+tree1[i]-tree1[j]); 38 } 39 } 40 } 41 int maxn=0; 42 for(int i=0;i<=W;i++) maxn=max(maxn,dp[T][i]); 43 cout<<maxn; 44 return 0; 45 }
标签:poj include div determine cos lin string over cond
原文地址:http://www.cnblogs.com/cjoier-nfy/p/7436695.html