2024/11/23课堂记录
目录
- 非空整数划分
- 挖地雷
- 小朋友的数字
- 最大子矩阵
- 城市交通路网(作业)
- 数的划分 洛谷P1025
没啥好说的,dp,看注释
点击查看代码
#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;
}
- 最大子矩阵 洛谷P1719
方法一:前缀和+小暴力(贪心)
点击查看代码
#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;
}