专栏文章

1月8日错题总结

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqkcchg
此快照首次捕获于
2025/12/04 06:13
3 个月前
此快照最后确认于
2025/12/04 06:13
3 个月前
查看原文

T2

错误原因

模板没记清楚,把最长下降子序列变成最长上升子序列。因为错的地方是判断是否形成了最长下降子序列,而a[j]>a[i]是的变成了判断最长上升子序列。
CPP
#include<bits/stdc++.h>
using namespace std;
int dp[105],pd[105],a[105];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		dp[i]=1;
		for(int j=1;j<=i;j++)
			if(a[j]<a[i])
				dp[i]=max(dp[i],dp[j]+1);
	}
	for(int i=n;i>=1;i--)
	{
		pd[i]=1;
		for(int j=i+1;j<=n;j++)
			if(a[j]>a[i])
				pd[i]=max(pd[i],pd[j]+1);
	}
	int mx=-1e9;
	for(int i=1;i<=n;i++)
		mx=max(mx,dp[i]+pd[i]-1);
	cout<<n-mx; 
	return 0;
}
错误出在
CPP
	for(int i=n;i>=1;i--)
	{
		pd[i]=1;
		for(int j=i+1;j<=n;j++)
			if(a[j]>a[i])
				pd[i]=max(pd[i],pd[j]+1);
	}
a[j]>a[i]处。

正确代码:

CPP
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,a[105]={},dp[105]={},pd[105]={};
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		dp[i]=1;
		for(int j=1;j<=i-1;j++)
			if(a[i]>a[j])
				dp[i]=max(dp[i],dp[j]+1);
	}
	for(int i=n;i>=1;i--)
	{
		pd[i]=1;
		for(int j=i+1;j<=n;j++)
			if(a[i]>a[j])
				pd[i]=max(pd[i],pd[j]+1);
	}
	int mx=-1e9;
	for(int i=1;i<=n;i++)
		mx=max(mx,dp[i]+pd[i]-1);
	cout<<n-mx;
	return 0;
}

T3

错误原因

没开long long
CPP
#include<bits/stdc++.h>
using namespace std;
int dp[25][25],dx[]={2,2,1,1,-2,-2,-1,-1},dy[]={-1,1,-2,2,-1,1,-2,2},n,m,mx,my;
bool check(int x,int y)
{
	for(int i=0;i<8;i++)
		if(x==dx[i]+mx&&y==dy[i]+my)
			return 0;
	if(x==mx&&y==my)
		return 0;
	return 1;
}
int main()
{
	cin>>n>>m>>mx>>my;
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			if(i==0&&j==0)
			{
				dp[i][j]=1;
				continue;
			}
			if(check(i,j)==0)
				continue;
			if(i==0)
				dp[i][j]=dp[i][j-1];
			else if(j==0)
				dp[i][j]=dp[i-1][j];
			else 
				dp[i][j]+=dp[i-1][j]+dp[i][j-1];
		}
	}
	cout<<dp[n][m];
	return 0;
}
错误出在
CPP
int dp[25][25],dx[]={2,2,1,1,-2,-2,-1,-1},dy[]={-1,1,-2,2,-1,1,-2,2},n,m,mx,my;
int处。

正确代码:

CPP
#include<bits/stdc++.h>
using namespace std;
long long dp[25][25],dx[]={2,2,1,1,-2,-2,-1,-1},dy[]={-1,1,-2,2,-1,1,-2,2},n,m,mx,my;
bool check(int x,int y)
{
	for(int i=0;i<8;i++)
		if(x==dx[i]+mx&&y==dy[i]+my)
			return 0;
	if(x==mx&&y==my)
		return 0;
	return 1;
}
int main()
{
	cin>>n>>m>>mx>>my;
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			if(i==0&&j==0)
			{
				dp[i][j]=1;
				continue;
			}
			if(check(i,j)==0)
				continue;
			if(i==0)
				dp[i][j]=dp[i][j-1];
			else if(j==0)
				dp[i][j]=dp[i-1][j];
			else 
				dp[i][j]+=dp[i-1][j]+dp[i][j-1];
		}
	}
	cout<<dp[n][m];
	return 0;
}

T4

错误原因

模板没记清楚,没仔细检查,导致a[i]变成了dp[i]使得答案从dp[i]=max(dp[i-1]+a[i],a[i]);变成了dp[i]=dp[i-1]+a[i];
CPP
#include<bits/stdc++.h>
using namespace std;
int dp[100005],a[100005];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
		dp[i]=max(dp[i-1]+a[i],dp[i]);
	int mx=-1e9;
	for(int i=1;i<=n;i++)
		mx=max(mx,dp[i]);
	cout<<mx;
	return 0;
}
错误出在
CPP
	for(int i=1;i<=n;i++)
		dp[i]=max(dp[i-1]+a[i],dp[i]);
max(dp[i-1]+a[i],dp[i])处。

正确代码

CPP
#include<bits/stdc++.h>
using namespace std;
int dp[100005],a[100005];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	dp[1]=a[1];
	for(int i=2;i<=n;i++)
		dp[i]=max(dp[i-1]+a[i],a[i]);
	int mx=-1e9;
	for(int i=1;i<=n;i++)
		mx=max(mx,dp[i]);
	cout<<mx;
	return 0;
}

T5

错误原因

不记得怎么写了,一顿瞎写
CPP
#include<bits/stdc++.h>
using namespace std;
int dp[105][105],n,m,k,a[105][105];
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	dp[1][1]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int i1=i+1;i1<=n;i1++)
			{
				for(int j1=j+1;j1<=n;j1++)
				{
					if(a[i][j]==a[i1][j1])
						continue;
					dp[i1][j1]+=dp[i][j];
				}
			}
		}
	}
	cout<<dp[n][m];
	return 0;
}
错误出在
CPP
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int i1=i+1;i1<=n;i1++)
			{
				for(int j1=j+1;j1<=n;j1++)
				{
					if(a[i][j]==a[i1][j1])
						continue;
					dp[i1][j1]+=dp[i][j];
				}
			}
		}
	}
i1=i+1;i1<=nj1=j+1;j1<=n处。

正确代码

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1000000007;
int n,m,k,dp[105][105],ans,a[105][105];
signed main()
{
	cin>>n>>m>>k;
	dp[1][1]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			for(int i2=1;i2<i;i2++)
				for(int j2=1;j2<j;j2++)
					if(a[i2][j2]!=a[i][j])
						dp[i][j]+=dp[i2][j2],dp[i][j]%=mod;
	cout<<dp[n][m];
	return 0;
}

T6

错误原因

没有特判,因为有些是永远走不到的,所以要特判
CPP
#include<bits/stdc++.h>
using namespace std;
int dp[105][105],a[105][105],n,m;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=2;i<=n;i++)
		a[i][1]=0;
	for(int j=1;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
		{
			dp[i][j]=max(dp[i][j-1],max(dp[i-1][j-1],dp[i+1][j-1]));
			dp[i][j]+=a[i][j];
		}
	}
	cout<<dp[n][m];
	return 0;
}
错误出在
CPP
		{
			dp[i][j]=max(dp[i][j-1],max(dp[i-1][j-1],dp[i+1][j-1]));
			dp[i][j]+=a[i][j];
		}
少写了一个特判。

正确代码

CPP
#include<bits/stdc++.h>
using namespace std;
int dp[105][105],a[105][105],n,m;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int j=1;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(i>j)
				continue;
			dp[i][j]=max(dp[i][j-1]+a[i][j],max(dp[i-1][j-1]+a[i][j],max(dp[i+1][j-1]+a[i][j],dp[i][j]+a[i][j])));
		}
	}
	cout<<dp[n][m];
	return 0;
}

T7

错误原因

dp技术不太行,不会写

正确思路

判断是从上一层走下来时间少,还是跳过一层上来的时间少,还是跳过两层

正确代码:

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,a[N],f[N];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
		cin>>a[i];
	f[0]=0;
	for(int i=1;i<=n+1;i++)
	{
		f[i]=f[i-1]+a[i];
		if(i-2>=0)
			f[i]=min(f[i],f[i-2]+a[i]);
		if(i-3>=0)
			f[i]=min(f[i],f[i-3]+a[i]);
	}
	cout<<f[n+1]<<endl;
	return 0;
}

T8

错误原因

dp技术不太行,不会写

正确思路

仔细观察样例,可以发现上一位数有偶数个3的数*9加上一位数有奇数个3的数,x为当前位数的整数个数

正确代码:

CPP
#include<bits/stdc++.h>
using namespace std;
long long dp[10005][3],n;
int main()
{
	cin>>n;
	dp[1][1]=1;
	dp[1][2]=8;
	int x=9;
	for(int i=2;i<=n;i++)
	{
		x=x*10%12345;
		dp[i][2]=dp[i-1][2]*9+dp[i-1][1];
		dp[i][1]=x-dp[i][2];
		dp[i][2]=(dp[i][2]%12345+12345)%12345;
		dp[i][1]=(dp[i][1]%12345+12345)%12345;
	}
	cout<<dp[n][2];
	return 0;
}

T9

错误原因

数组开小了,循环套反了,代码写错了
CPP
#include<bits/stdc++.h>
using namespace std;
int dp[105][105],a[105][105],n,m;
int main()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int j=1;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(i==1)
				dp[i][j]=min(dp[i][j-1],dp[n][j-1]);
			else
				dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]);
			dp[i][j]+=a[i][j];
		}
	}
	int mn=1e9;
	for(int i=1;i<=n;i++)
		mn=min(mn,dp[i][m]);
	cout<<mn;
	return 0;
}
错误出在
CPP
int dp[105][105],a[105][105],n,m;

	for(int j=1;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(i==1)
				dp[i][j]=min(dp[i][j-1],dp[n][j-1]);
			else
				dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]);
			dp[i][j]+=a[i][j];
		}
	}
dp[105][105],a[105][105]j=1;j<=m;j++i=1;i<=n;i++ 处。

正确代码:

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int n,m,a[N][N],f[N][N];
int main()
{
	cin>>n>>m;
	for(int j=1;j<=m;j++)
	for(int i=1;i<=n;i++)
	cin>>a[i][j];
	memset(f,0x3f,sizeof f);
	for(int j=1;j<=m;j++)
		f[1][j]=a[1][j];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			f[i][j]=min(f[i][j],f[i-1][j]+a[i][j]);
			if(j==1)
				f[i][j]=min(f[i][j],f[i-1][m]+a[i][j]);
			else
				f[i][j]=min(f[i][j],f[i-1][j-1]+a[i][j]);
		}
	}
	int ans=1e9;
	for(int j=1;j<=m;j++)
		ans=min(ans,f[n][j]);
	cout<<ans;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...