2 条题解

  • 0
    @ 2025-10-8 16:52:05
    #include<bits/stdc++.h>
    using namespace std;
    int f[1100][1100][2];//f[l][r][0]:l~r的灯全关而最后关的是l,f[l][r][1]:l~r的灯全关而最后关的是r
    int s[1100];
    struct node{int p,w;}a[1100];//p是位置,w是功耗 
    bool cmp(node n1,node n2){return n1.p<n2.p;}
    int main()
    {
        int n,st;scanf("%d%d",&n,&st);
        for(int i=1;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].w);
        sort(a+1,a+n+1,cmp);
        s[0]=0;for(int i=1;i<=n;i++) s[i]=a[i].w+s[i-1];
        
        memset(f,0x3f,sizeof(f));
        for(int i=1;i<=n;i++) f[i][i][0]=f[i][i][1]=abs(a[i].p-a[st].p)*s[n];//在走过st-i的这段路,所有灯都在消耗 
        for(int L=2;L<=n;L++)//长度 
        {
            for(int l=1,x,y,r;l<=n-L+1;l++)//起点 
            {
                r=l+L-1;
                x=f[l+1][r][0]+(s[n]-(s[r]-s[l]))*(a[l+1].p-a[l].p);
                y=f[l+1][r][1]+(s[n]-(s[r]-s[l]))*(a[r].p-a[l].p);
                f[l][r][0]=min(x,y);
                  
                x=f[l][r-1][0]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[l].p);
                y=f[l][r-1][1]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[r-1].p);
                f[l][r][1]=min(x,y);
            }
        }
        printf("%d\n",min(f[1][n][0],f[1][n][1]));
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:53
      #include<bits/stdc++.h>
      using namespace std;
      int f[1100][1100][2];//f[l][r][0]:l~r的灯全关而最后关的是l, f[l][r][1]:l~r的灯全关而最后关的是r
      int s[1100];
      struct node{int p,w;}a[1100];//p是位置,w是功耗 
      bool cmp(node n1,node n2){return n1.p<n2.p;}
      int main()
      {
          int n,st;scanf("%d%d",&n,&st);
      	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].w);
          sort(a+1,a+n+1,cmp);
          s[0]=0;for(int i=1;i<=n;i++) s[i]=a[i].w+s[i-1];
          
          memset(f,0x3f,sizeof(f));
      	for(int i=1;i<=n;i++) f[i][i][0]=f[i][i][1]=abs(a[i].p-a[st].p)*s[n];//在走过st-i的这段路,所有灯都在消耗 
          for(int L=2;L<=n;L++)//长度 
          {
              for(int l=1,x,y,r;l<=n-L+1;l++)//起点 
              {
                  r=l+L-1;
                  x=f[l+1][r][0]+(s[n]-(s[r]-s[l]))*(a[l+1].p-a[l].p);
                  y=f[l+1][r][1]+(s[n]-(s[r]-s[l]))*(a[r].p-a[l].p);
                  f[l][r][0]=min(x,y);
                    
                  x=f[l][r-1][0]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[l].p);
                  y=f[l][r-1][1]+(s[n]-(s[r-1]-s[l-1]))*(a[r].p-a[r-1].p);
                  f[l][r][1]=min(x,y);
              }
          }
          printf("%d\n",min(f[1][n][0],f[1][n][1]));
          return 0;
      }
      • 1

      *【动态规划:区间中间推】关路灯

      信息

      ID
      29
      时间
      1000ms
      内存
      128MiB
      难度
      4
      标签
      递交数
      47
      已通过
      24
      上传者