【专业找水题】状压dp最水题,没有之一

题目链接

现在代码能力没上升,倒是越来越会找水题了(比例题还水的裸题你值得拥有)

这网站不是针对竞赛的,所以时空限制都很宽松

然后就让我水过去了

对于每个点,包括自己的前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)

原文地址:https://www.cnblogs.com/wanglichao/p/5777841.html