uvalive4731

3688 단어 DP구간 dp
제목 대의: 숫자의 개수 n과 나누어야 할 조수 w를 제시한다.그리고 각 숫자의 확률을 제시하여 최소한의 수학적 기대를 구한다.
아이디어: DP.최소한의 수학적 기대를 요구하기 때문에 확률이 높은 것은 앞에 놓아야 하기 때문에 먼저 순서를 정해야 한다.dp[i][j]는 i조 전 j개의 숫자가 얻을 수 있는 가장 작은 수학적 기대를 나타낸다.
코드:
#include 
using namespace std;
#include 
#include 
#include 
const int INF = 0x3f3f3f3f;
const int maxn = 105;

int f[maxn][maxn];
int num[maxn],sum[maxn];
bool cmp(int a,int b) {
    return a > b;
}
int main() {

    int t;
    scanf("%d",&t);
    while(t--) {
        int n,w;
        scanf("%d %d",&n,&w);
        for(int i = 1; i <= n; i++)
            scanf("%d",&num[i]);
        sort(num + 1, num + 1 + n,cmp);

        sum[1] = num[1];
        for(int i = 2; i <= n ; i++)
            sum[i] = num[i] + sum[i - 1];

        for(int i = 1; i <= w; i++) {//  
            for(int j = i ; j <= i + n -w; j++) {//  j       <= i + n - w        w - i              ,  j   n - (w - i) i + n - w
                if(i == 1) {//            
                    f[i][j] = j * sum[j];
                    continue;
                }
                f[i][j] = INF;
                for(int k = i - 1; k < j ; k++) 
                    f[i][j] = min(f[i][j],f[i - 1][k] + j *(sum[j] - sum[k]));//            

            }
        }
        //printf("%d
",f[w][n]);
double ans = f[w][n]/100.0; printf("%.4lf
"
,ans); } return 0; }

좋은 웹페이지 즐겨찾기