Problem D. Eat Cake Google Kickstart Round F 2017
阿新 • • 發佈:2018-11-09
題意:給定一個數N,問N最少是多少個平方數的和。
這種求最優值的問題90%都是裸的DP。。。
dp[n]表示最少的組成n的平方數的個數。狀態轉移列舉平方數x和其出現的次數k,dp[n]=min(dp[n],dp[n-x*k])。因為平方數x最多100個,出現次數最多是10000/x,複雜度也是可以接受的。因為不同的N dparray值相同,可以先預處理求出dp array.
#include<iostream> #include<stdio.h> #include<cstdio> #include<string> #include<cmath> #include<stdlib.h> #include<algorithm> #include<string.h> #include<cstring> #include<vector> #include<queue> #include<map> #include<set> #include<windows.h> using namespace std; //Kcikstart 2017 Round F Problem D. Eat Cake const int maxn=10010; int T; int N; int dp[maxn]; int main() { // freopen("input.txt","r",stdin); freopen("D-large-practice.in","r",stdin); freopen("D.txt","w",stdout); cin>>T; memset(dp,0x3f,sizeof(dp)); // for(int i=0;i<=100;i++) // { // dp[i*i]=1; // } dp[0]=0; for(int i=1;i<maxn;i++) { for(int j=1;j*j<=i;j++) { for(int k=1;k*j*j<=i;k++) { dp[i]=min(dp[i],k+dp[i-k*j*j]); } } } for(int ca=1;ca<=T;ca++) { scanf("%d",&N); printf("Case #%d: %d\n",ca,dp[N]); } return 0; }