那些年没有AC的水题...

HDU 5492(dp

题目:一个数字矩阵,要求找到一条路径使得经过的数字的方差最小.

思路:稍微把式子变换一下,状态是走到当前格子和为k时最小平方和.

/*
* @author:  Cwind
*/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <map>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <set>
#include <cmath>
using namespace std;
#define IOS std::ios::sync_with_stdio (false);std::cin.tie(0)
#define pb push_back
#define PB pop_back
#define bk back()
#define fs first
#define se second
#define sq(x) (x)*(x)
#define eps (1e-6)
#define IINF (1<<29)
#define LINF (1ll<<59)
#define INF (1000000000)
#define FINF (1e3)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> P;

const int maxsum=1900;
const int maxn=40;
int T,n,m;
int grid[maxn][maxn];
int dp[maxn][maxn][maxsum];
int h[maxn][maxn];
int pos[maxn][maxn][maxsum];
int inf;
int cas=0;
int main(){
    freopen("/home/files/CppFiles/in","r",stdin);
    //freopen("test.in","r",stdin);
    //freopen("test.out","w",stdout);
    memset(dp,0x3f,sizeof dp);
    inf=dp[0][0][0];
    cin>>T;
    while(T--){
        cin>>n>>m;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                scanf("%d",&grid[i][j]);
            }
        }
        dp[0][0][grid[0][0]]=sq(grid[0][0]);
        pos[0][0][0]=grid[0][0];
        h[0][0]=1;
        int ans=inf;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                for(int k=0;k<h[i][j];k++){
                    int v=pos[i][j][k];
                    if(dp[i+1][j][v+grid[i+1][j]]==inf){
                        pos[i+1][j][h[i+1][j]++]=v+grid[i+1][j];
                        dp[i+1][j][v+grid[i+1][j]]=dp[i][j][v]+sq(grid[i+1][j]);
                    }else{
                        dp[i+1][j][v+grid[i+1][j]]=
                            min(dp[i][j][v]+sq(grid[i+1][j]),
                                dp[i+1][j][v+grid[i+1][j]]);
                    }
                    if(dp[i][j+1][v+grid[i][j+1]]==inf){
                        pos[i][j+1][h[i][j+1]++]=v+grid[i][j+1];
                        dp[i][j+1][v+grid[i][j+1]]=dp[i][j][v]+sq(grid[i][j+1]);
                    }else{
                        dp[i][j+1][v+grid[i][j+1]]=
                            min(dp[i][j][v]+sq(grid[i][j+1]),
                                dp[i][j+1][v+grid[i][j+1]]);
                    }
                    if(i==n-1&&j==m-1){
                        ans=min(ans,dp[i][j][v]*(n+m-1)-v*v);
                    }
                    dp[i][j][v]=inf;
                }
                h[i][j]=0;
            }
        }
        for(int i=0;i<=max(n,m);i++){
            for(int j=0;j<h[i][m];j++){
                int v=pos[i][m][j];
                dp[i][m][v]=inf;
            }
            h[i][m]=0;
            for(int j=0;j<h[n][i];j++){
                int v=pos[n][i][j];
                dp[n][i][v]=inf;
            }
            h[n][i]=0;
        }
        printf("Case #%d: %d\n",++cas,ans);
    }
    return 0;
}

时间: 2024-08-04 13:13:38

那些年没有AC的水题...的相关文章

codeforces 710A A. King Moves(水题)

题目链接: A. King Moves 题意: 给出king的位置,问有几个可移动的位置; 思路: 水题,没有思路; AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <bits/stdc++.h> #include <stack> #include &l

涨姿势题2_水题_两种解法

Problem Description 涨姿势题就是所谓的优化题,在组队赛中,队伍发现了一题水题,那么应该交给谁去处理?作为处理水题的代码手,应该具备什么样的素养?1,要快,水题拼的就是速度!2,不能卡水题!水题都卡,绝对不是一个代码手的风范!3,不能出错,错一次即罚时20分钟,对于水题来讲是致命的!4,要能看出来一题是水题!没有这条,上面三条都是没有意义的! 如果你希望你成团队中一个合格的代码手,那么这套题是你最好的选择,快AC吧! 本系列即是为了提高水题代码手的素养而准备的!水题经常需要用到

BestCoder4——Miaomiao&#39;s Geometry(水题。不知道放什么分类)

Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 10    Accepted Submission(s): 3 Problem Description There are N point on X-axis . Miaomiao would like to cover them ALL by us

水题是糖 甜到忧伤

比赛的题目真是怒赞. 多天之后自己来敲了个水题A,果真甜到忧伤哇 "AAAAAAAAAAA"的字典序是比"AC"小的! #include <iostream> #include <cstring> #include <map> #include <cstdio> #include <cmath> using namespace std; char s[105]; int main() { int T; sc

【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning

最近刷水太多标注一下防止它淹没在silver的水题中--我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班.对于任何航班,指定了其中的k个农场作为枢纽. (1 < = K <= 200 , K < = N). 目前,共有M种单向航班( 1 < = M < = 20,000 ),第i个航班从农场u_i至农场v_i花费d_i ( 1 < = d_i < =10,000 )美元.

说一说ST表 讲一讲水题

ST表 一.算法介绍 如何快速求解RMQ问题呢?暴力复杂度O(n),线段树复杂度O(n)~O(logn),要是数据规模达到10^7或者更高呢?我们需要一种可以做到O(1)查询的算法,这时就可以用到ST表. 我们用 f[i][j] 表示从 j 位置开始往右 2^i 个数内的最大值,用 g[i][j] 表示从j位置开始往左 2^i 个数内的最大值.所以 f[0][j] , g[0][j] 就为 j 位置上的数,可以在预处理中O(n)处理掉. 接下来我们要求出每个位置的每个 2^i 区间的最大值.可以

hdu-5804 Price List(水题)

题目链接: Price List Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 262144/131072 K (Java/Others) Problem Description There are n shops numbered with successive integers from 1 to n in Byteland. Every shop sells only one kind of goods, and the

hdu-5641 King&#39;s Phone (水题)

题目链接: King's Phone Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 418    Accepted Submission(s): 123 Problem Description In a military parade, the King sees lots of new things, including an An

简单的dp hdu 数塔(水题)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21314    Accepted Submission(s): 12808 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少