专栏文章
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;
}
错误出在
CPPint 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
错误原因
模板没记清楚,没仔细检查,导致
CPPa[i]变成了dp[i]使得答案从dp[i]=max(dp[i-1]+a[i],a[i]);变成了dp[i]=dp[i-1]+a[i];#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<=n和j1=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;
}
错误出在
CPPint 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 条评论,欢迎与作者交流。
正在加载评论...