1258 数字金字塔
一本通的题目相比与洛谷的题好的多,所以,我们来练习一本通的题目吧
只要把一本通的这些题全部弄透,考场上不用怕
然后再练练搜索,就可以复习了
模板题,数字三角形的动态规划
还有就是这一篇文章我将把他们和一起来解决
其实数字三角形并不难,只需要套公式就好了,数字三角形的公式也不难理解
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int SIZE=1005;
int a[SIZE][SIZE];
int n;
int f[SIZE][SIZE];
int ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];
}
}
for(int i=1;i<=n;i++)
ans=max(ans,f[n][i]);
cout<<ans<<endl;
return 0;
}
1259 最长不下降序列
当然,这也是一个模板题目
也就是,这个题,不需要连续,不连续的序列,因为不是子序列,所以不需要连续
因为f数组是用来记录的长度,我们最后需要求的是具体的每一个数,所以还得
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int n,a[1005],f[1005],maxx;
int m,k,c[1005],i,j;
maxx=-inf;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)//将最长不下降序列存储道f数组里面
{
f[i]=1;
for(j=1;j<i;j++)
{
if(a[j]<=a[i]&&f[j]+1>f[i])//不下降并且满足最长序列
f[i]=f[j]+1;
}
if(f[i]>maxx)
{
maxx=f[i];//求出最长的序列
k=i;//记录下标
}
}
int t=0;
m=maxx;
c[t++]=k;
i=k-1;//c[]数组存储最长不下降序列的每一个下标,m总长度,每次循环完就要-1,i为所有数字下标
while(m>1)
{
if(f[i]==m-1&&a[i]<=a[k])//k下标记录上一个数组,i记录当前的数字
{
//回倒求出下标然后输出每一个元素
c[t++]=i;//存储下标
k=i;//记录一下当前的下标
m--;
}
i--;
}
printf("max=%d\n",maxx);
for(i=t-1;i>0;i--)
printf("%d ",a[c[i]]);
printf("%d\n",a[c[0]]);
}
1261 城市交通图
题目不用说了,就是让你求最短路径,但是题目说,让用最优原理来求最短路径,貌似不太理解
也即是分层求最短路径
#include <iostream>
#include <algorithm>
using namespace std;
const int N=110;
long long e[N][N],ne[N];
long long dis[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>e[i][j];
for(int i=1;i<n;i++) dis[i]=123456;//a[i] 表示城市n到i的距离
for(int i=n-1;i>=0;i--)
{
for(int j=i+1;j<=n;j++)
{
//条件:n与j连通,i与j连通.
if(dis[i]>e[i][j