子曰:“君子喻于义,
小人喻于利。”
君子晓得是道义,小人只知道利益。
本文讲述了概率和动态规划,涉及到前缀和的优化,图上动态,高次幂的累计,决策。
https://www.luogu.com.cn/problem/CF1042E
但是状态的表示有1000×1000个。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1010;
const int mod= 998244353;
vector<int>a[N*N];
int vis[N*N];
int f[N*N];
int n,m;
vector<int>ans;
int dist(int l,int r)
{
return (a[l][2]-a[r][2])*(a[l][2]-a[r][2])+(a[l][1]-a[r][1])*(a[l][1]-a[r][1]);
}
int pow_m(int a,int x)
{
int res=1;
while(x)
{
if(x&1)
{
res=res*a;
res%=mod;
}
a=a*a;
a%=mod;
x>>=1;
}
return res;
}
int inv(int b)
{
return pow_m(b,mod-2);
}
int dp(int u)
{
// for(auto i:ans)
// cout<<i<<" ";
// cout<<'\n';
if(u>=n*m)
{
return 0;
}
if(vis[u])return f[u];
int start;
vis[u]=true;
for(start=u+1;start<=n*m&&a[start][0]>=a[u][0];start++)
{
}
for(int i=start;i<=n*m;i++)
{
//ans.push_back(i);
f[u]+=(dp(i)+dist(i,u))%mod*inv(n*m-start+1)%mod;
f[u]%=mod;
//ans.pop_back();
}
return f[u];
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int b;
cin>>b;
a[(i-1)*m+j]=vector<int>{b,i,j};
}
}
sort(a+1,a+n*m+1,greater<vector<int>>());
int now;
int sx,sy;
cin>>sx>>sy;
for(int i=1;i<=n*m;i++)
{
if(a[i][1]==sx&&a[i][2]==sy)
{
now=i;
break;
}
}
// for(int i=1;i<=n*m;i++)cout<<a[i][0]<<" ";
// cout<<"\n";
// ans.push_back(now);
cout<<dp(now);
}
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1000010,M=N*7;
int h[N],e[M],w[M],ne[M],idx;
const int mod=998244353;
int n,m;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int f[100010],g[100010],s1,s2;
void dp(int now)
{
if(g[now])return ;
g[now]=1;
for(int i=h[now];~i;i=ne[i])
{
int j=e[i];
dp(j);
(g[now]+=g[j])%=mod;
(f[now]+=f[j]+g[j])%=mod;
}
}
int pow_m(int x,int y)
{
int ret=1;
x%=mod;
while(y)
{
if(y&1)
ret=ret*x%mod;
y>>=1;
x=x*x%mod;
}
return ret;
}
signed main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=1,x,y;i<=m;i++)
{
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++)
{
if(!g[i])dp(i);
}
for(int i=1;i<=n;i++)
{
s1+=f[i];
s1%=mod;
s2+=g[i];
s2%=mod;
}
cout<<s1*pow_m(s2,mod-2)%mod;
}
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int w,n,k;
int pow_m(int a,int x)
{
int res=1;
while(x)
{
if(x&1)res=res*a;
x>>=1;
a=a*a%mod;
res%=mod;
}
return res;
}
int inv(int a)
{
return pow_m(a,mod-2);
}
signed main()
{
cin>>w>>n>>k;
cout<<w*inv(pow_m(2,k))%mod;
}
https://www.luogu.com.cn/problem/P1850
这又是概率+策略的动态规划。
还是要体会你能把控的是什么,不能把控的用期望计算。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e3+10;
const double inf=1e17+5;
int n,m,v,e,c[N][2],d[310][310];
double k[N],f[N][N][2],ans;
signed main()
{
memset(d,0x3f,sizeof d);
cin>>n>>m>>v>>e;
for(int i=1;i<=n;i++)
{
cin>>c[i][0];
}
for(int i=1;i<=n;i++)
cin>>c[i][1];
for(int i=1;i<=n;i++)
cin>>k[i];
for(int i=1;i<=e;i++)
{
int x,y,w;
cin>>x>>y>>w;
d[x][y]=d[y][x]=min(d[x][y],w);
}
for(int k=1;k<=v;k++)
{
for( int i=1;i<=v;i++)
{
for(int j=1;j<=v;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
for(int i=1;i<=v;i++)
{
d[i][i]=d[i][0]=d[0][i]=0;
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j][0]=f[i][j][1]=inf;
}
}
f[1][0][0]=f[1][1][1]=0;
for(int i=2;i<=n;i++)
{
f[i][0][0]=f[i-1][0][0]+d[c[i-1][0]][c[i][0]];
for(int j=1;j<=min(i,m);j++)
{
int C1=c[i-1][0];
int C2=c[i-1][1];
int C3=c[i][0];
int C4=c[i][1];
f[i][j][0]=min({f[i][j][0],f[i-1][j][0]+d[C1][C3],f[i-1][j][1]+d[C2][C3]*k[i-1]+(1-k[i-1])*d[C1][C3]});
f[i][j][1]=min(
{
f[i-1][j-1][0]+d[C1][C4]*k[i]+d[C1][C3]*(1-k[i]),
f[i-1][j-1][1]+d[C2][C4]*k[i]*k[i-1]+d[C1][C4]*k[i]*(1-k[i-1])+
d[C2][C3]*k[i-1]*(1-k[i])+d[C1][C3]*(1-k[i-1])*(1-k[i])});
}
}
ans=inf;
for(int i=0;i<=m;i++)
{
ans=min({f[n][i][1],ans,f[n][i][0]});
}
printf("%.2lf",ans);
}