HDU1421
//dp 给定n个数字和k,求找出k对数字使得所有对数字差的平方和最小
//先给其从小到大进行排序,可知选取规则必须是选取相邻的两个数
//状态 dp[i][j]表示从前i个数选j组差的平方和最小
//当j*2==i时即i个数必须选完dp[i][j]=dp[i-2][j-1]+(a[i-1]-a[i])*(a[i-1]-a[i])
//否则dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i-1]-a[i])*(a[i-1]-a[i]))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <iostream> #include <algorithm> #include <string.h> using namespace std; int a[2005]; long long dp[2005][1005]; int main() { int n,k; while (cin>>n>>k) { for ( int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1); for ( int i=1;i<=2002;i++) for ( int j=1;j<=1002;j++) dp[i][j]=0; for ( int i=2;i<=n;i++) { for ( int j=1;j<=k&&2*j<=i;j++) { if (j*2==i) dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]); else dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])); } } cout<<dp[n][k]<<endl; } return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步