题解仅供参考!!!不要抄袭!!!(doge)

题解数量:11

跳转至目录[1]


海盗队长信奥怪猫侠2[2]

详细题解以及思路点击此处跳转

乘法游戏[3]

#include <bits/stdc++.h>
using namespace std;
const int MAXN=105;
int f[MAXN][MAXN],a[MAXN],n,ans;
int dp(int x,int y){
	if(y-x==1) return 0;
	if(f[x][y]!=f[0][0]) return f[x][y];
	for(int i=x+1;i<y;i++) f[x][y]=min(f[x][y],dp(x,i)+dp(i,y)+a[x]*a[i]*a[y]);
	return f[x][y];
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    memset(f,127,sizeof(f));
	cout<<dp(1,n);
	return 0;
}

演讲大厅安排[4]

见gsx的GF2025B3背包大合集

工作分配问题[5]

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[1005][1005],n,ans=INT_MAX;//数组初始化
bool b[105];//判重数组
void dfs(int sum,int dep){
	if(sum>ans) return;
	if(dep>n){//结束条件
		ans=min(sum,ans);//取最小值
		return;
	}
	//int min1=INT_MAX;
	for(int i=1;i<=n;i++){
		if(b[i]==false){//判重
		b[i]=true;//已经检查过
		dfs(sum+a[dep][i],dep+1);//递归
		b[i]=false;//取消检查
		}	
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)cin>>a[i][j];
	dfs(0,1);
	cout<<ans<<endl;//答案
	return 0;
}
// /files

过河卒[6]

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=5055;
ll dp[MAXN][MAXN];
int n,m,x,y;
bool add(int i,int j,int x,int y){//这一个函数来判断卒是否在马移动范围内
	return i==x && j==y
	|| i==x-2 && j==y-1 || i==x-2 && j==y+1
	|| i==x-1 && j==y-2 || i==x-1 && j==y+2
	|| i==x+1 && j==y-2 || i==x+1 && j==y+2
	|| i==x+2 && j==y-1 || i==x+2 && j==y+1;
}
int main(){
	ios::sync_with_stdio(0);//加快时间
	cin.tie(0);//加快时间
	cout.tie(0);//加快时间
	cin>>n>>m>>x>>y;
	n++;m++;x++;y++;
	dp[0][1]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(!add(i,j,x,y)) dp[i][j]=dp[i][j-1]+dp[i-1][j];
	cout<<dp[n][m];
	return 0;
}

乘积最大[7]

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll num[15],dp[15][15],mg[15][15];//数组初始
ll n,k,x;
int main(){
	cin>>n>>k>>x;
	k++;
	int m=n;
	while(x>0){
		num[m--]=x%10;//数组每一位初始化
		x/=10;
	}
	for(int i=1;i<=n;i++){
		ll mlp=mg[i][i]=num[i];
		for(int j=i+1;j<=n;j++){
			mlp=mlp*10+num[j];//算当前值
			mg[i][j]=mlp;//保存
		}
	}
	for(int i=1;i<=n;i++) dp[i][1]=mg[1][i];
	for(int kk=2;kk<=k;kk++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<i;j++)
				dp[i][kk]=max(dp[j][kk-1]*mg[j+1][i],dp[i][kk]);//取最大
	cout<<dp[n][k];//答案
	return 0;//AC!!!
}

滑雪[8]

#include<bits/stdc++.h>
using namespace std;
int skl[105][105],sum[105][105];
int dx[]={0,-1,1,0,0};
int dy[]={0,0,0,-1,1};
int r,c,ans=INT_MIN;
bool line(int x,int y){
	if(x<1||y<1||x>r||y>c)return 0;//判断是否违法出界
	else return 1;
}
int dfs(int x/*行*/,int y/*列*/){
	if(sum[x][y]>0)return sum[x][y];
    sum[x][y]=1;
    int len=0;
	for(int i=1;i<=4;i++){
		int newx=x+dx[i];
		int newy=y+dy[i];
		if(line(newx,newy)&&skl[newx][newy]<skl[x][y]){//判断
			len=max(len,dfs(newx,newy));//滑行长度
		}
	}
    return sum[x][y]=len+1; //长度
}
int main(){
    cin>>r>>c;
    for(int i=1;i<=r;i++){//行
        for(int j=1;j<=c;j++){//列
            cin>>skl[i][j];//输入
        }
    }
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            ans=max(ans,dfs(i,j));//取最大
        }
    }
	cout<<ans;//答案
}

装载问题[9]

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[1005],n,x,ans;
void dfs(int sum,int dep){
	if(sum>x) return ;//结束条件1
    ans=max(ans,sum);//取最大
    if(dep>n) return;//结束条件2
	dfs(sum+a[dep],dep+1);//选
    dfs(sum,dep+1);//不选
}
int main(){
	cin>>n>>x;//输入
	for(int i=1;i<=n;i++) cin>>a[i];//输入
	dfs(0,1);//初始总和为0,dep层级为1,因为已进行1次了
	cout<<ans<<endl;//答案
	return 0;
}
// /files

迷宫问题[10]

#include <bits/stdc++.h>
using namespace std;
int n,a[1005][1005],cnt=0;
bool b[1005][1005];
int dx[8]{-1,-1,-1,0,0,1,1,1};//经典上下左右
int dy[8]{-1,0,1,-1,1,-1,0,1};//上述
void dfs(int x,int y){
	if(x==1 && y==n){//是否到达终点
		cnt++;//方案次数
		return;	
	}
	for(int j=0;j<8;j++){
		int nx=x+dx[j];//新x坐标
		int ny=y+dy[j];//新y坐标
		if(x>=1 && x<=n && y>=1 && y<=n && a[nx][ny]==0 && b[nx][ny]==false){//判断是否违法越界
			b[x][y]=true;//判重
			dfs(nx,ny);//递归
			b[x][y]=false;//取消
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) cin>>a[i][j];
	}
	//输入
	b[1][1]=true;//注意这个别忘了加,初始点遍历过了
	dfs(1,1); //初始点
	cout<<cnt;//答案
	return 0;//AC!!!
}
// /files

GCD和LCM是好朋友(数据加强版)[11]

#include<bits/stdc++.h>
#define ll unsigned long long//数据太大了
#define AC return 0
using namespace std;
ll x,y,cnt;
ll gcd(ll x,ll y){//检查k是否是y约数
	return y?gcd(y,x%y):x;
}
int main(){
	cin>>x>>y;
	for(ll k=1;k<=sqrt(y);k++){//遍历所有可能的k值
		if(y%k==0){
			if(gcd(k,y/k*x)==x){
				cnt++;
			}
			if(y/k!=k){
				if(gcd(y/k,k*x)==x){
					cnt++;
				}
			}
		}
	}
	cout<<cnt;//答案
	AC;//等价 return 0;
}

N皇后问题[12]

#include <bits/stdc++.h>
using namespace std;
int n,ans[15];
bool b[15],zx[20],yx[20],out=false;//数组
void dfs(int dep){
	if(dep>n){
		for(int i=1;i<=n;i++) cout<<setw(5)<<ans[i];//注意宽敞
		cout<<endl;
		out=true;//有方案
		return;
	}
	for(int i=1;i<=n;i++){
		if(!b[i]&&!zx[dep+i]&&!yx[i-dep+n]){//判断是否违法出界
			b[i]=zx[dep+i]=yx[i-dep+n]=true;//这里用来判重
			ans[dep]=i;//答案储存
			dfs(dep+1);//递归
			b[i]=zx[dep+i]=yx[i-dep+n]=false;//取消
		}
	}
}
int main(){
	cin>>n;
	dfs(1);//dep层级从1~n
	if(out==false) cout<<"no solute!";//无方案
	return 0;//AC!!!
}
// /files
/*
@*@@
@@@*
*@@@
@@*@
*/
//呃呃呃这是根据题目做的

标准目录页


  1. 跳转[顶部] ↩︎

  2. 跳转[海盗队长信奥怪猫侠2] ↩︎

  3. 跳转[乘法游戏] ↩︎

  4. 跳转[演讲大厅安排] ↩︎

  5. 跳转[工作分配问题] ↩︎

  6. 跳转[过河卒] ↩︎

  7. 跳转[乘积最大] ↩︎

  8. 跳转[滑雪] ↩︎

  9. 跳转[装载问题] ↩︎

  10. 跳转[迷宫问题] ↩︎

  11. 跳转[GCD和LCM是好朋友(数据加强版)] ↩︎

  12. 跳转[N皇后问题] ↩︎