To My Girlfriend HDU

来源:互联网 发布:seo sem是什么工作 编辑:程序博客网 时间:2024/05/21 01:53

那个式子可以想成有两个物品必拿,有两个物品必不拿,最后体积小于等于m的方案数

也是同样想到了n^3的dp,必然会T,走进死沟,看了题解,才想到...


不要考虑太多,对每个物品,有四种拿的状态,拿,必定拿,不拿,必定不拿

这样就裸的转移就可以了


#include<bits/stdc++.h>using namespace std;int a[1005];long long dp[2][1005][3][3];const int mo=1e9+7;int main(){int T;cin>>T;while(T--){int n,s,i,j,k1,k2,now,pre;cin>>n>>s;for(i=0;i<n;i++)scanf("%d",&a[i]);memset(dp,0,sizeof(dp));dp[0][0][0][0]=1;now=1,pre=0;for(i=0;i<n;i++){memset(dp[now],0,sizeof(dp[now]));for(j=s;j>=0;j--){for(k1=0;k1<=2;k1++){for(k2=0;k2<=2;k2++){dp[now][j][k1][k2]=(dp[now][j][k1][k2]+dp[pre][j][k1][k2])%mo;if(k2)dp[now][j][k1][k2]=(dp[now][j][k1][k2]+dp[pre][j][k1][k2-1])%mo;}}if(j>=a[i]){for(k1=0;k1<=2;k1++){for(k2=0;k2<=2;k2++){dp[now][j][k1][k2]=(dp[now][j][k1][k2]+dp[pre][j-a[i]][k1][k2])%mo;if(k1)dp[now][j][k1][k2]=(dp[now][j][k1][k2]+dp[pre][j-a[i]][k1-1][k2])%mo;}}}}swap(now,pre);}long long ans=0;for(i=1;i<=s;i++)ans=(ans+dp[pre][i][2][2])%mo;cout<<ans*4%mo<<endl;}return 0;}