标签:
现在代码能力没上升,倒是越来越会找水题了(比例题还水的裸题你值得拥有)
这网站不是针对竞赛的,所以时空限制都很宽松
然后就让我水过去了
对于每个点,包括自己的前m个元素是否取都是一种状态,所以状压一下(才1024不要怂)
1 #include <cstdio> 2 int n,m,q; 3 int a[1001]; 4 int dp[1001][2000]; 5 int max(int a,int b){return(a<b)?b:a;} 6 int main() 7 { 8 scanf("%d%d%d",&n,&m,&q); 9 for(int i=1;i<=n;i++) 10 scanf("%d",&a[i]); 11 int add=1<<(m-1); 12 for(int i=1;i<=n;i++) 13 for(int j=0;j<=(add<<1)-1;j++) 14 { 15 int k=j,sum=0; 16 while(k) 17 sum+=k&1,k>>=1; 18 if(sum>q) continue; 19 dp[i][j>>1]=max(dp[i][j>>1],dp[i-1][j]); 20 if(sum==q && !(j&1)) continue; 21 dp[i][(j>>1)+add]=max(dp[i][(j>>1)+add],dp[i-1][j]+a[i]); 22 } 23 int ans=0; 24 for(int j=0;j<=add<<1;j++) 25 ans=max(ans,dp[n][j]); 26 printf("%d",ans); 27 return 0; 28 }
先用这道题熟悉一下状压的套路吧,到时候还要补轮廓线= =
调试要点:
1.位运算
2.位运算
3.位运算
(其实就是所有左移右移都要加括号,为了这玩意儿我爆了N发OJ)
标签:
原文地址:http://www.cnblogs.com/wanglichao/p/5777841.html