【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)
2016-09-01 18:48
483 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5492
题目大意:
一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走。求(N+M-1)ΣN+M-1(Ai-Aavg)2最小。Aavg为平均值。
(N,M<=30,矩阵里的元素0<=C<=30)
题目思路:
【动态规划】
首先化简式子,得原式=(N+M-1)ΣN+M-1(Ai2)-(ΣN+M-1Ai)2
f[i][j][k]表示走到A[i][j]格子上,此时前i+j-1个值得和(Σi+j-1Ai)为K的平方和(Σi+j-1Ai2)最小值。
向下或向右转移很好推。
由于每个格子的值<=30,K<=59*30=1770.总时间复杂度为O(N*M*K)
View Code
http://acm.hdu.edu.cn/showproblem.php?pid=5492
题目大意:
一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走。求(N+M-1)ΣN+M-1(Ai-Aavg)2最小。Aavg为平均值。
(N,M<=30,矩阵里的元素0<=C<=30)
题目思路:
【动态规划】
首先化简式子,得原式=(N+M-1)ΣN+M-1(Ai2)-(ΣN+M-1Ai)2
f[i][j][k]表示走到A[i][j]格子上,此时前i+j-1个值得和(Σi+j-1Ai)为K的平方和(Σi+j-1Ai2)最小值。
向下或向右转移很好推。
由于每个格子的值<=30,K<=59*30=1770.总时间复杂度为O(N*M*K)
// //by coolxxx //#include<bits/stdc++.h> #include<iostream> #include<algorithm> #include<string> #include<iomanip> #include<map> #include<stack> #include<queue> #include<set> #include<bitset> #include<memory.h> #include<time.h> #include<stdio.h> #include<stdlib.h> #include<string.h> //#include<stdbool.h> #include<math.h> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define abs(a) ((a)>0?(a):(-(a))) #define lowbit(a) (a&(-a)) #define sqr(a) ((a)*(a)) #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) #define mem(a,b) memset(a,b,sizeof(a)) #define eps (1e-8) #define J 10000 #define mod 1000000007 #define MAX 0x7f7f7f7f #define PI 3.14159265358979323 #define N 44 using namespace std; typedef long long LL; int cas,cass; int n,m,lll,ans; LL aans; int a ; int sum; int f [2004]; void print() { int i,j,k; for(i=0;i<=sum;i++) printf("%d\n",f [m][i]); } int main() { #ifndef ONLINE_JUDGE // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); #endif int i,j,k; // for(scanf("%d",&cass);cass;cass--) for(scanf("%d",&cas),cass=1;cass<=cas;cass++) // while(~scanf("%s",s+1)) // while(~scanf("%d",&n)) { mem(f,MAX); sum=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); f[0][1][0]=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { for(k=a[i][j];k<=59*30;k++) { f[i][j][k]=min(f[i][j][k],f[i-1][j][k-a[i][j]]+sqr(a[i][j])); f[i][j][k]=min(f[i][j][k],f[i][j-1][k-a[i][j]]+sqr(a[i][j])); } } } ans=MAX; for(i=0;i<=59*30;i++) { if(f [m][i]==f[0][0][0])continue; ans=min(ans,(n+m-1)*f [m][i]-sqr(i)); } printf("Case #%d: %d\n",cass,ans); } return 0; } /* // // */
View Code
相关文章推荐
- 【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)
- hdu 5492 Find a path(dp+少量数学)2015 ACM/ICPC Asia Regional Hefei Online
- HDU 5492 Find a path DP —— 2015 ACM-ICPC Asia Regional Hefei Online
- HDU 5492 Find a path DP —— 2015 ACM-ICPC Asia Regional Hefei Online
- 【HDU】5492 Find a path(2015 ACM/ICPC Asia Regional Hefei Online)
- HDU 5492 Find a path(DP)——2015 ACM/ICPC Asia Regional Hefei Online
- HDU - 5491 The Next 2015 ACM/ICPC Asia Regional Hefei Online
- HDU 5491 The next(2015 ACM/ICPC Asia Regional Hefei Online )(贪心)
- HDU 5491 The Next(表示我的方法比较暴力,但需要考虑的东西比较少)——2015 ACM/ICPC Asia Regional Hefei Online
- 【HDU】5493 Queue(2015 ACM/ICPC Asia Regional Hefei Online)
- HDU 5489 Removed Interval 2015 ACM/ICPC Asia Regional Hefei Online (LIS变形)
- 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)
- HDU 5491 The Next 构造(2015 ACM/ICPC Asia Regional Hefei Online)
- 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)
- 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)
- HDU 5478 Can you find it(数学归纳法 + 快速幂)——2015 ACM/ICPC Asia Regional Shanghai Online
- HDU 5478 Can you find it(快速幂)——2015 ACM/ICPC Asia Regional Shanghai Online
- HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)
- 【线段树】HDU 5493 Queue (2015 ACM/ICPC Asia Regional Hefei Online)
- 【HDU】5491 The Next(2015 ACM/ICPC Asia Regional Hefei Online)