1 数字三角形及衍生

1 数字三角形及衍生,第1张

目录

数字三角形模板

摘花生

最低通行费

方格取数


数字三角形模板
  1. #include
    using namespace std;
    const int N=1000;
    int a[N][N],f[N][N];
    int main()
    {
       int n,ans=-INT_MAX;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++)
                if(j==1) f[i][j]=f[i-1][j]+a[i][j];//第一列只能从上一行转移
                else if(j==i) f[i][j]=f[i-1][j-1]+a[i][j];//每行的最后一个数只能从上一行的最后一个数转移
                else f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];//否则就上一行的数与前一个数进行转移
        for(int i=1;i<=n;i++) ans=max(ans,f[n][i]);//最后求一次到达n的最大值
        cout<
摘花生

 信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

 

 

#include
using namespace std;
const int N=1e3+10;
int f[N][N],w[N][N];//表示到达i,j这个点的步数的集合的最大值
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
       scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            scanf("%d",&w[i][j]);
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            f[i][j]=max(f[i][j-1],f[i-1][j])+w[i][j];//从左边或者上面选的最大值
        printf("%d\n",f[n][m]);
    }
    return 0;
}
最低通行费

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

因为限制了2n-1步,故到右下角的点只能往下和往右走,思路跟摘花生的一样 

#include
using namespace std;
const int N=110,INF=0x3f3f3f3f;
int f[N][N],w[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
         cin>>w[i][j];
//因为这题要求求最小值,则初始化周围的数为正无穷
  for(int i=2;i<=n;i++) f[0][i]=INF;
  for(int i=2;i<=n;i++) f[i][0]=INF;
     for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
          f[i][j]=min(f[i-1][j],f[i][j-1])+w[i][j];//从左边或者上边走的最小值
    cout<
方格取数

​​​​​​信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

 

#include
using namespace std;
const int N=11,INF=0x3f3f3f3f;
int f[2*N][N][N],w[N][N];
int main()
{
    int n;
    cin>>n;
    int a,b,c;
    while(cin>>a>>b>>c,a||b||c) w[a][b]=c;
  for(int k=2;k<=n+n;k++)
     for(int i1=1;i1<=n;i1++)
        for(int i2=1;i2<=n;i2++)
         {
             int j1=k-i1,j2=k-i2;//弄出j1和j2
             if(j1>=1&&j1<=n&&j2>=1&&j2<=n)//假如j合法
            {
             int t=w[i1][j1];
             if(i1!=i2) t+=w[i2][j2];//并且不是同个点
             int &x=f[k][i1][i2];
             x=max(x,f[k-1][i1-1][i2-1]+t);//i1和i2向下
             x=max(x,f[k-1][i1-1][i2]+t);//i1向下和i2向右
             x=max(x,f[k-1][i1][i2-1]+t);//i1向右和i2向下
             x=max(x,f[k-1][i1][i2]+t);//i1向右和i2向右
             }
         }
    cout<

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/674827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)