poj解題報告 1191

2021-06-28 18:38:13 字數 1198 閱讀 9719

這題動態規劃,太難了,參考了別人的思路,寫了這份報告。

分析一下,根據題意,要求均方差ans = sqrt(sum((x[i]-x的平均值)^2)/n),ans^2=sum(x[i]*x[i])/n-(x的平均值)^2,而x的平均值是固定值(即所有方格數字的和/n),所以只要使得切割後的矩形的總分的平方和盡量小,由於切割只能沿著棋盤的邊進行,故對於左上角座標為[x1,y1],右下角座標[x2,y2]的棋盤,可以沿著橫線切或者沿著豎線切,如用dp[n][x1][y1][x2][y2]表示將上述矩形切割為n個時的矩形的總分的最小平方和,則有在橫向有狀態轉移方程:dp[n][x1][y1][x2][y2] = min((dp[n][x1][y1][i][y2]+sum(i+1,y1,x2,y2)))

**如下

#include#include#define n 9

#define d 16

#define inf 9999999

int dp[d][n][n][n][n];

int s[n][n][n][n];

int a[n][n];

int n;

int sum(int x1,int y1,int x2,int y2)

s[x1][y1][x2][y2]=ans*ans;

return s[x1][y1][x2][y2];

}int divide(int n,int x1,int y1,int x2,int y2)

if(dp[n][x1][y1][x2][y2]!=-1)

return dp[n][x1][y1][x2][y2];

min=inf;

for(i=x1;im)

min=m;

m=divide(n-1,i+1,y1,x2,y2)+sum(x1,y1,i,y2);

if(min>m)

min=m;

} for(j=y1;jm)

min=m;

m=divide(n-1,x1,j+1,x2,y2)+sum(x1,y1,x2,j);

if(min>m)

min=m;

} dp[n][x1][y1][x2][y2]=min;

return min;

}void main()

{ int i,j;

double sum=0.0,ans;

scanf("%d",&n);

for(i=1;i

poj解題報告 1328

不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...

poj解題報告 2586

這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...

poj解題報告 2635

這題特別好理解,就是 坑啊。題意就是給乙個數,這個數是兩個大素數的積,再給出乙個數,如果最小的素數比給的數大,列印good,否則列印bad和最小的素數。這題用的方法是高精度求模 同餘模定理。還有素數打表,把10 6內的素數全部預打表,在求模時則列舉到小於l為止。注意打表不能只打到100w,要保證素數...