• 博客园Logo
  • 首页
  • 新闻
  • 博问
  • 专区
  • 闪存
  • 班级
  • 我的博客 短消息
    用户头像
    我的博客 我的园子 账号设置 退出登录
    注册 登录
AC_Artist.zig_zag
然而我依然在补题、
随笔- 83  文章- 0  评论- 12 
博客园    首页    新随笔    联系   管理    订阅  订阅

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\n",k,ans);
62     }
63 }
Removed Interval

 

posted @ 2015-10-02 19:16  Zig_zag  阅读(282)  评论(0)  编辑  收藏
刷新评论刷新页面返回顶部
Copyright © 2021 Zig_zag
Powered by .NET 5.0 on Kubernetes