zoukankan      html  css  js  c++  java
  • Hdu 5489 合肥网络赛 1009 Removed Interval

    跳跃式LIS(nlogn),在普通的转移基础上增加一种可以跨越一段距离的转移,用一颗新的树状数组维护,同时,我们还要维护跨越完一次后面的转移,所以我用了3颗树状数组。。

    比赛的时候一句话位置写错了,然后就。。。雪崩

    呆马:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <vector>
     6 #include <algorithm>
     7 using namespace std;
     8 int a[100][100];
     9 int sum,ans,num;
    10 int t,n,m,x,y;
    11 int dp[50][50][3002];
    12 int main()
    13 {
    14     scanf("%d",&t);
    15     for (int k=1;k<=t;k++)
    16     {
    17         memset(a,0,sizeof(a));
    18         memset(dp,0,sizeof(dp));
    19 
    20         scanf("%d%d",&n,&m);
    21         for(int i=1;i<=n;i++)
    22             for (int j=1;j<=m;j++)
    23                 scanf("%d",&a[i][j]);
    24 
    25         dp[1][1][a[1][1]]=a[1][1]*a[1][1];
    26 
    27         for (int i=1;i<=n;i++)
    28         {
    29             for (int j=1;j<=m;j++)
    30             {
    31                 x=i-1; y=j-1;
    32                 if (i==1 && j==1) continue;
    33                 for (int k=1;k<=2000;k++)
    34                 {
    35                     if (dp[x][j][k]==0) continue;
    36                     sum=k+a[i][j];
    37                     num=dp[x][j][k]+a[i][j]*a[i][j];
    38                     if (dp[i][j][sum]==0) dp[i][j][sum]=num;
    39                     dp[i][j][sum]=min(dp[i][j][sum],num);
    40                 }            
    41                 for (int k=1;k<=2000;k++)
    42                 {
    43                     if (dp[i][y][k]==0) continue;
    44                     sum=k+a[i][j];
    45                     num=dp[i][y][k]+a[i][j]*a[i][j];
    46                     if (dp[i][j][sum]==0) dp[i][j][sum]=num;
    47                     dp[i][j][sum]=min(dp[i][j][sum],num);
    48                 }
    49                 
    50             }
    51         }    
    52         
    53         ans=999999999;
    54         for (int i=1;i<=2000;i++)
    55         {
    56             if (dp[n][m][i]==0) continue;
    57             num=(n+m-1)*dp[n][m][i]-i*i;
    58             //cout<<i<<' '<<dp[n][m][i]<<' '<<num<<endl;
    59             ans=min(ans,num);
    60         }
    61         printf("Case #%d: %d
    ",k,ans);
    62     }
    63 }
    Removed Interval
  • 相关阅读:
    安卓小助手
    位图切割器&位图裁剪器
    OAuth2.0 的简介
    多账户的统一登录方案
    常用的一些SQL语句
    SQL语句的优化
    SpringCloud简介与5大常用组件
    数据库为什么需要锁机制?有哪些锁机制?
    高并发下如何优化能避免服务器压力过大?
    Spring MVC 简介
  • 原文地址:https://www.cnblogs.com/zig-zag/p/4852578.html
Copyright © 2011-2022 走看看