2024/11/23课堂记录

目录

  1. 非空整数划分
  2. 挖地雷
  3. 小朋友的数字
  4. 最大子矩阵
  5. 城市交通路网(作业)
点击查看代码
#include<iostream>
using namespace std;
int f[210][10];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(j==1||i==j)f[i][j]=1;	//n分成n个数/一个数,只有一种方法
			else if(i>j)f[i][j]=f[i-1][j-1]+f[i-j][j];//有单个:数-1,个-1,无单个:每个数都-1,个不变
			else f[i][j]=0;//3分成5个数,不可能
	cout<<f[n][m];
	return 0;
}
.
  • 挖地雷 一本通1262(✘*)
    80分,错误未知
点击查看代码
#include<iostream>
using namespace std;
int a[220],f[220],nnext[220];
bool mp[220][220];
void oout(int start)
{
	if(nnext[start]==0)cout<<start<<"\n";
	else
	{
		cout<<start<<"-";
		oout(nnext[start]);
	}
}
int main()
{
	int n,x,y,maxx=-1,start=-1;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	while(cin>>x>>y,x!=0&&y!=0)mp[x][y]=1;
	for(int i=n;i>=1;i--)
	{
		f[i]=a[i];
		for(int j=i+1;j<=n;j++)
			if(mp[i][j]==1&&f[i]<a[i]+f[j])
			{
				f[i]=f[j]+a[i],nnext[i]=j;
				if(f[i]>maxx)maxx=f[i],start=i;
			}
	}
	for(int i=1;i<=n;i++)maxx=max(maxx,f[i]);
	oout(start);
	cout<<maxx;
	return 0;
}
.
  • 小朋友的数字 洛谷P1982 重 要
    一位最大连续子段和+递推
    最后20分比较难拿,要考虑非递增,写注释了,看注释
点击查看代码
#include<iostream>
using namespace std;
long long int a[1000010],b[1000010],c[1000010];
int main()
{
    int n,p;
    cin>>n>>p;
    for(int i=1;i<=n;i++)cin>>a[i];
    b[1]=a[1];
    long long int maxx=a[1],sum=a[1];
    for(int i=2;i<n;i++)
    {
        if(sum<0)
        {
            sum=0;
        }
        sum+=a[i];
        maxx=max(maxx,sum);
        b[i]=maxx;
    }
    c[1]=b[1];
    maxx=b[1]+c[1];
    bool f=1;
    for(int i=2;i<n;i++)
	{
        c[i]=maxx;
        maxx=max(maxx,b[i]+c[i]);
        if(maxx>p)              //一旦这个if成立了,说明他是个正数 
		{
            maxx%=p;
            f=0;
        }
    }
    if(f==1)
        cout << max(c[1],maxx)%p;  
//如果没有取余说明要么是负数,要么没取余过, 是负数的话必须要和c[1]比,不是负数,maxx肯定>c[1],但比无妨 
    else
        cout << maxx%p;         
//是正数就一定会越来越大,不需要看c[1](由于此时maxx已经被%q了,可能maxx取余后比c[1]小了,所以不能再和c[1]比了)  
    return 0;
}
.
点击查看代码
#include<iostream>
using namespace std;
int a[200][200],n,dp[200][200],maxx=0xafffffff;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	{
    		cin>>a[i][j];
    		if(i==1&&j==1)dp[i][j]=a[i][j];
    		else dp[i][j]=a[i][j]+dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
		}
	for(int i=1;i<=n;i++)//(i,j)左上角
		for(int j=1;j<=n;j++)
			for(int s=i;s<=n;s++)//(s,t)右下角
				for(int t=j;t<=n;t++)
					maxx=max(maxx, dp[s][t]-dp[s][j-1]-dp[i-1][t]+dp[i-1][j-1]);
	cout<<maxx<<endl;
	return 0;
} 
方法二:前缀和+dp(作业)
posted @ 2024-11-23 21:54  永韶  阅读(5)  评论(0编辑  收藏  举报