POJ 2948 DP,poj2948dp
一個row*col的矩陣,每個格子內有兩種礦yeyenum和bloggium,並且知道它們在每個格子內的數量是多少。最北邊有bloggium的收集站,最西邊有 yeyenum 的收集站。現在要在這些格子上面安裝向北或者向西的傳送帶(每個格子自能裝一種)。問最多能採到多少礦。
DP,狀態轉移方程為
dp[i][j]=Max(dp[i][j-1]+suma[i][j],dp[i-1][j]+sumb[i][j]);
其中sumb[i][j]是第i行1到j列的需要到西邊的礦石的價值,suma[i][j]是第j列1到i行需要到最北邊的礦石的價值
#include "stdio.h"#include "string.h"int dp[510][510],suma[510][510],sumb[510][510],a[510][510],b[510][510];int Max(int a,int b ){ if (a<b) return b;else return a;}int main(){ int n,m,i,j; while (scanf("%d%d",&n,&m)!=EOF) { if (n+m==0)break; for (i=1;i<=n;i++) for (j=1;j<=m;j++) scanf("%d",&b[i][j]); for (i=1;i<=n;i++) for (j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(suma,0,sizeof(suma)); memset(sumb,0,sizeof(sumb)); for (i=1;i<=n;i++) for (j=1;j<=m;j++) suma[i][j]=suma[i-1][j]+a[i][j]; for (j=1;j<=m;j++) for (i=1;i<=n;i++) sumb[i][j]=sumb[i][j-1]+b[i][j]; memset(dp,0,sizeof(dp)); for (i=1;i<=n;i++) for (j=1;j<=m;j++) { dp[i][j]=Max(dp[i][j-1]+suma[i][j],dp[i-1][j]+sumb[i][j]); } printf("%d\n",dp[n][m]); } return 0;}
POJ 1004 大牛幫忙看看為何是ANSWER WRONG把找不出來錯誤
把void main換成int main,main函數的括弧內的void刪掉,不用任何參數,最後還要加上return 0,用void main很容易出問題的,還有,最後那個printf那裡應該是%.2f,換了應該就可以了。如果還不行的話,就把全部float換成double,f換成lf
幫我看看POJ1458為何老WA?
改了,邏輯錯誤
/*
北京大學ACM-ICPC Online Judge,Pro.1458
LCS最長公用字串動態規划算法
*/
#include<cstdio>
#include<memory>
#include<cstdlib>
#define MAX(a,b) (a>b?a:b)
using namespace std;
const int maxLenth=1000;
char s1[maxLenth],s2[maxLenth];
int DP[maxLenth][maxLenth];
int LCS(char *,char *);
int main(int, char **)
{
//freopen("1458in.txt","r",stdin);
while (scanf("%s%s",s1,s2)>0)
{
printf("%d\n",LCS(s1,s2));
}
return 0;
}
int LCS(char *s1,char *s2)
{
int i, j;
int len1, len2;
memset(DP,0,sizeof(DP));
for (i=0;s1[i];i++)
for (j=0;s2[j];j++)
if (s1[i]==s2[j])
DP[i][j]=1;
len1=i;len2=j;
for (i=0;i<len1;i++)
for (j=0;j<len2;j++)
{
int temp1,temp2,temp3;
temp1=j>0?DP[i][j-1]:0;
temp2=i>0?DP[i-1][j]:0;
temp3=(i>0&&j>0)?DP[i-1][j-1]:0;
if(DP[i][j])
DP[i][j]=temp3+1;
else
DP[i][j]=MAX(temp1,temp2)+DP[i][j];
}
return DP[len1-1][len2-1];
}