http://poj.org/problem?id=1191
DP 一不小心开了个五维数组
double ans[k][x1][y1][x2][y2] 表示(x1,y1)到(x2,y2)可以割k次时与平均数最小平方和
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<queue> #include<algorithm> #include<set> using namespace std; const int N=15; const double M=100000000.0; double ans[N][10][10][10][10]; double K; int sum[10][10][10][10]; int a[10][10]; int n; int dpsum( int x1, int y1, int x2, int y2) //求(x1,y1)到(x2,y2) 的和 { if (sum[x1][y1][x2][y2]!=-1) return sum[x1][y1][x2][y2]; if (x1==x2&&y1==y2) { sum[x1][y1][x2][y2]=a[x1][y1]; } else if (x1<x2) { sum[x1][y1][x2][y2]=dpsum(x1,y1,x1,y2)+dpsum(x1+1,y1,x2,y2); } else if (y1<y2) { sum[x1][y1][x2][y2]=dpsum(x1,y1,x2,y1)+dpsum(x1,y1+1,x2,y2); } return sum[x1][y1][x2][y2]; } double FFmin( double x, double y) { return (x<y)?x:y; } double dpans( int k, int x1, int y1, int x2, int y2) { if (ans[k][x1][y1][x2][y2]>=0.0) { return ans[k][x1][y1][x2][y2]; } if (k==0) { ans[k][x1][y1][x2][y2]=((sum[x1][y1][x2][y2]-K)*(sum[x1][y1][x2][y2]-K)); return ans[k][x1][y1][x2][y2]; } ans[k][x1][y1][x2][y2]=M; for ( int x=x1;x<x2;++x) { ans[k][x1][y1][x2][y2]=FFmin(ans[k][x1][y1][x2][y2], (dpans(k-1,x1,y1,x,y2))+(sum[x+1][y1][x2][y2]-K)*(sum[x+1][y1][x2][y2]-K)); ans[k][x1][y1][x2][y2]=FFmin(ans[k][x1][y1][x2][y2], (dpans(k-1,x+1,y1,x2,y2))+(sum[x1][y1][x][y2]-K)*(sum[x1][y1][x][y2]-K)); } for ( int y=y1;y<y2;++y) { ans[k][x1][y1][x2][y2]=FFmin(ans[k][x1][y1][x2][y2], (dpans(k-1,x1,y1,x2,y))+(sum[x1][y+1][x2][y2]-K)*(sum[x1][y+1][x2][y2]-K)); ans[k][x1][y1][x2][y2]=FFmin(ans[k][x1][y1][x2][y2], (dpans(k-1,x1,y+1,x2,y2))+(sum[x1][y1][x2][y]-K)*(sum[x1][y1][x2][y]-K)); } return ans[k][x1][y1][x2][y2]; } void begin( int n) { for ( int i=0;i<n;++i) for ( int l1=1;l1<=8;++l1) for ( int l2=1;l2<=8;++l2) for ( int l3=1;l3<=8;++l3) for ( int l4=1;l4<=8;++l4) { ans[i][l1][l2][l3][l4]=-1.0; } for ( int l1=1;l1<=8;++l1) for ( int l2=1;l2<=8;++l2) for ( int l3=1;l3<=8;++l3) for ( int l4=1;l4<=8;++l4) { dpsum(l1,l2,l3,l4); } } int main() { while ( scanf ( "%d" ,&n)!=EOF) { for ( int i=1;i<=8;++i) { for ( int j=1;j<=8;++j) { scanf ( "%d" ,&a[i][j]); } } memset (sum,-1, sizeof (sum)); begin(n); K=1.0*sum[1][1][8][8]/n; printf ( "%.3f\n" , sqrt (1.0*dpans(n-1,1,1,8,8)/n)); } return 0; } |
分类:
DP
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理