1月8日错题总结

· · 个人记录

T2

错误原因

模板没记清楚,把最长下降子序列变成最长上升子序列。因为错的地方是判断是否形成了最长下降子序列,而a[j]>a[i]是的变成了判断最长上升子序列。

#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;
}

错误出在

    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]处。

正确代码:

#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

#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;
}

错误出在

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处。

正确代码:

#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];

#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;
}

错误出在

    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])处。

正确代码

#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

错误原因

不记得怎么写了,一顿瞎写

#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;
}

错误出在

    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处。

正确代码

#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

错误原因

没有特判,因为有些是永远走不到的,所以要特判

#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;
}

错误出在

        {
            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];
        }

少写了一个特判。

正确代码

#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技术不太行,不会写

正确思路

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

正确代码:

#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为当前位数的整数个数

正确代码:

#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

错误原因

数组开小了,循环套反了,代码写错了

#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;
}

错误出在

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++ 处。

正确代码:

#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;
}