看到同学吃鸡了就vp康康。
被两道dp搞死了,两个没什么人过的题都没看,估计也不会。
那么为什么别人AK了呢。。。
手速还是凑合的。。。音游狗(错乱)
E就是个背包记录一下方案,暴力比较字典序即可。
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define mk(a,b) make_pair(a,b) 4 #define rep(jiantongyingtxdy) for(int i=1;i<=jiantongyingtxdy;i++) 5 using namespace std; 6 typedef long long ll; 7 const int N = 3e5+5; 8 int t,n;int a[105],dp[4396]; 9 vector<int> pre[4396]; 10 int main(){ 11 ios::sync_with_stdio(false); 12 while (cin>>t){ 13 if(t==0)return 0; 14 memset(dp,0, sizeof(dp)); 15 memset(pre,0, sizeof(pre)); 16 cin>>n; 17 for(int i=1;i<=n;i++)cin>>a[i]; 18 for(int i=1;i<=n;i++){ 19 for(int j=t;j>=a[i];j--){ 20 if(dp[j]<dp[j-a[i]]+a[i]){ 21 dp[j]=dp[j-a[i]]+a[i]; 22 pre[j]=pre[j-a[i]]; 23 pre[j].push_back(i); 24 }else if(dp[j]==dp[j-a[i]]+a[i]){//比较pre[j-a[i]] 和pre[j] 25 int f=1; 26 for(int k=0;k<min(pre[j].size(),pre[j-a[i]].size());k++){ 27 if(pre[j][k]<pre[j-a[i]][k]){ 28 f=0; 29 break; 30 }else if(pre[j][k]>pre[j-a[i]][k]){ 31 f=2; 32 break; 33 } 34 } 35 if(f==2){ 36 pre[j]=pre[j-a[i]]; 37 pre[j].push_back(i); 38 } 39 } 40 } 41 } 42 // for(int i=10;i>=1;i--){ 43 // for(auto x:pre[i]){ 44 // cout<<x<<' '; 45 // } 46 // cout<<endl; 47 // } 48 int ans = *max_element(dp+1,dp+1+t); 49 for(auto x:pre[ans]){ 50 cout<<a[x]<<' '; 51 } 52 cout<<ans<<endl; 53 // int ppp=ans; 54 // for(int i=n;i>=1;i--){ 55 // if(dp[ans]==dp[ans-a[i]]+a[i]){ 56 // cout<<a[i]<<' '; 57 // ans-=a[i]; 58 // } 59 // } 60 // cout<<ppp<<endl; 61 } 62 }
F 我们看到e很小,考虑状压,好像没睡午觉脑子很混乱,两行代码改来改去好久。。
#include <bits/stdc++.h> #define pii pair<int,int> #define mk(a,b) make_pair(a,b) #define rep(jiantongyingtxdy) for(int i=1;i<=jiantongyingtxdy;i++) using namespace std; typedef long long ll; const int N = 3e5+5; const ll MOD = 1e9+7; int n,e,k; ll dp[2005][4396]; set<pii>st; int main(){ ios::sync_with_stdio(false); cin>>n>>e>>k;int x,y; while (k--){ cin>>x>>y; st.insert(mk(x,y)); } dp[0][0]=1; int p = 2*e+1,mod=1<<p; for(int i=1;i<=n;i++){ for(int j=0;j<mod;j++){//i-1 for(int k=0;k<p;k++){//拿第i+k-e个 if(i+k-e>n||i+k-e<=0)continue; if(st.count(mk(i,i+k-e)))continue; int b = j>>1;//i if(b&(1<<k))continue; dp[i][b|(1<<k)]+=dp[i-1][j]; dp[i][b|(1<<k)]%=MOD; } } } ll ans=0; for(int i=0;i<mod;i++){ ans+=dp[n][i]; ans%=MOD; } cout<<ans<<endl; }
然后就挂机打cf了。。。好气啊E题再给我10秒钟我就改完了。。搜了个单调队列的板子MLE了、、、然后没优化完就gg了。。。早知道不看F了。。。。
话说闵可夫斯基和 这几个性质我好像也都知道,,怎么就完全不会呢。。。
是个人都紫了。我还是退役吧。CGR4肯定又要掉100多。(