2022-9-20
T1:
扫雷
一眼看上去是一个DP题,但通过观察样例以及自己列举数据可以发现,若整个矩阵的第一个已确定是否有雷,那么整个矩阵都可以确定了。因此所有情况只可能有
代码:
#include<bits/stdc++.h>
#define MAXN 10010
using namespace std;
int n,a[MAXN],dp[MAXN],flag=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(a[1]==3||a[n]==3){printf("0");return 0;}
for(int j=0;j<=1;j++)
{
memset(dp,-1,sizeof(dp));
dp[1]=j;
dp[0]=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
if(dp[i-1]||dp[i]){break;}
dp[i+1]=0;
}
else if(a[i]==1)
{
if(dp[i-1]&&dp[i]){break;}
else if((!dp[i-1])&&(!dp[i]))
{
if(i<n)dp[i+1]=1;
else break;
}
else dp[i+1]=0;
}
else if(a[i]==2)
{
if(i==1)
{
if(!dp[i])break;
if(i<n)dp[i]=dp[i+1]=1;
else break;
}
else
{
if((!dp[i-1])&&(!dp[i])){break;}
else if(dp[i-1]&&dp[i])dp[i+1]=0;
else
{
if(i<n)dp[i+1]=1;
else break;
}
}
}
else if(a[i]==3)
{
if((!dp[i-1])||(!dp[i])){break;}
if(i<n)dp[i+1]=1;
else break;
}
if(i==n)flag++;
}
}
printf("%d",flag);
return 0;
}
T2:
互不侵犯
一道经典的状压
代码 :
#include<bits/stdc++.h>
#define MAXN 10
#define int long long
using namespace std;
int n,k,dp[11][110][1030],ans=0;//第i行,已经放了j个,状态为k
vector<int> sta;
void init()
{
for(int i=0;i<(1<<n);i++)
{
if(i&(i<<1))continue;
sta.push_back(i);
}
}
int num(int n)
{
int ans=0;
while(n)
{
ans+=(n&1);
n>>=1;
}
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&k);
init();
for(int i=0;i<sta.size();i++)
{
dp[1][num(sta[i])][sta[i]]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<sta.size();j++)
{
for(int l=0;l<=k;l++)
{
int nu=num(sta[j]);
if(l-nu<0)continue;
for(int kk=0;kk<sta.size();kk++)
{
if(sta[kk]&sta[j])continue;
if(sta[kk]&(sta[j]<<1))continue;
if(sta[kk]&(sta[j]>>1))continue;
dp[i][l][sta[j]]+=dp[i-1][l-nu][sta[kk]];
}
}
}
}
for(int i=0;i<sta.size();i++)
ans+=dp[n][k][sta[i]];
printf("%lld",ans);
return 0;
}
T3:
繁忙的都市
最小生成树板子,不多赘述。
代码:
#include<bits/stdc++.h>
#define MAXM 100010
#define MAXN 310
using namespace std;
int n,m,x,y,z,tot=0,maxans=0,cnt=0;
int father[MAXN];
int fa(int data)
{
if(father[data]==data)return data;
return father[data]=fa(father[data]);
}
struct edge
{
int l,r,w;
}ed[MAXM];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
ed[++tot].l=x;
ed[tot].r=y;
ed[tot].w=z;
}
for(int i=1;i<=n;i++)
father[i]=i;
sort(ed+1,ed+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(fa(ed[i].l)==fa(ed[i].r))continue;
maxans=max(maxans,ed[i].w);
father[fa(ed[i].l)]=father[fa(ed[i].r)];
cnt++;
if(cnt==n-1)break;
}
printf("%d %d",n-1,maxans);
return 0;
}
T4:
最大子矩阵
一道比较毒瘤的题。
观察数据范围,发现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效