周日就要打csp了,赶紧来复习一下
第23次 收集卡牌
#include<bits/stdc++.h>
using namespace std;
int n,k;
double p[20];
double f[64000*2][100];
double dfs(int s=0,int y=0){
if(f[s][y]>=0.0)return f[s][y];
double sum=0;
for(int i=0;i<n;i++){
if(s>>i&1)sum+=p[i]*dfs(s,y+1);
else sum+=p[i]*dfs(s|1<<i,y);
}
return f[s][y]=1+sum;
}
signed main(){
cin>>n>>k;
for(int i=0;i<n;i++)cin>>p[i];
for(int i=0;i<(1<<n);i++){
for(int j=0;j<=k*n;j++){
f[i][j]=-1;
if(__builtin_popcount(i)+j/k>=n)f[i][j]=0;
}
}
cout<<dfs();
}
第22次校门外的树
对n-1段区间去进行dp
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define int long long
const int mod=1e9+7;
int n,a[N],f[N];
vector<int>g[N];
int st[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)cin>>a